synchronized

阅读 / 问答 / 标签

synchronized和lock的区别,以及底层实现原理

总的来说,lock更加灵活。 主要相同点:Lock能完成synchronized所实现的所有功能 不同: 1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,

解释下Collections.synchronizedList都作了哪些工作

看了jdk的帮助,有一段示例代码:Collection c = Collections.synchronizedCollection(myCollection);...synchronized(c) {Iterator i = c.iterator(); // Must be in the synchronized blockwhile (i.hasNext())foo(i.next());}Iterator并没有被同步包装

concurrenthashmap支持高并发的原理,段锁为什么要采用重入锁而不是synchronized

ConcurrentHashMap只是保证本身map的线程安全,不保证你自己写的程序的同步.你可以采用客户端加锁实现同步synchronized(test.chm)

java多线程中,同步synchronized(){}括号中应该些什么?

括号里的东西就是你要操作的内容呀,一个操作的逻辑,一串代码当然了,这个东西对所有试图访问它的人来说是共有的,同时只允许一个人去做举个很简单的例子,有一个打印机,同时好几个人想去用它synchronized{applyPrinter(); // 申请使用打印机}当然了,也可以把这个方法声明为synchronized的 synchronized void applyPrinter();也可以用Lock去做

synchronized修饰静态方法和非静态方法的区别

synchronized在静态方法上表示调用前要获得类的锁,而在非静态方法上表示调用此方法前要获得对象的锁。public class StaticSynDemo {private static String a="test";//等同于方法print2public synchronized void print1(String b){ //调用前要取得StaticSynDemo实例化后对象的锁System.out.println(b+a);}public void print2(String b){synchronized (this) {//取得StaticSynDemo实例化后对象的锁System.out.println(b+a);}}//等同于方法print4public synchronized static void print3(String b){//调用前要取得StaticSynDemo.class类的锁System.out.println(b+a);}public static void print4(String b){synchronized (StaticSynDemo.class) { //取得StaticSynDemo.class类的锁System.out.println(b+a);}}}

synchronized是悲观锁吗

你碰到这个问题属于多线程共享资源(余额)的问题,可以给使用资源加锁的做法,悲观锁和乐观锁都可以实现,悲观锁适用于并发压力小的情况,乐观锁适用于并发压力大的情况。具体概念可以百度查询。在changeBalance的方法上加synchronized声明是属于悲观锁的做法,实际操作一般使用数据库提供的锁,余额是保存在数据库中的,使用select for update来加悲观锁。乐观锁一般是在更新余额之前先查询余额相关的版本,然后在事物操作要提交之前再查一次版本,将两个版本比对,如果相同说明没有其它线程或进程更新过此资源,可以提交,提交过后版本更新,否则则回滚之前的操作,重新执行此事物操作。实际操作过程中,锁操作一般由数据库提供支持,分布式系统中现在最常用的的是zookeeper。

java synchronized不起作用啊 代码如下

那是因为你插入的数据来源具有随机性。意思是说,你插入数据库中的nocode是从同一张表读取的,并做截取+1,有重复一点也不奇怪。

java方法synchronized在哪个类里面

synchronized 是java保留的关键字,不在那个具体的类中。

高人,java中 synchronized() 括号里面的参数问题 那个参数有什么用啊

传的是this 么? 。。同一个.java 文件里应该没区别。。如果有多个class 。。 其中有个class是负责同步线程的,那么,这个参数就是需要被同步的对象吧 。。。这个是我的理解

synchronized可以修饰静态方法吗

可以。Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”。

java 中synchronized方法的参数问题

synchronized是对象锁,而不是方法.obj是Object的一个实例,相当于一个标示.synchronized (obj){ if (index > 0){ try{ Thread.sleep(10); System.out.println(Thread.currentThread() .getName() + "卖了第" + index + "张饭票"); index--; }catch(InterruptedException e){ e.printStackTrace(); } }}这段代码的意思是说被synchronized (obj){ }包围的代码是同步的,同一时间内只能由一个线程使用.

synchronized和serializable区别java

synchronized是同步关键字, 表示线程安全的.serializable 接口是启用其序列化功能的接口。 表示类可以系列化.

synchronized会不会影响事务的回滚?

synchronized是线程同步,和事务是两码事,我觉得不会影响

java与模式,懒汉式单例类的synchronized作用?

如果多个线程在同一时刻访问时就会出现意外。

java synchronized可以防止高并发的问题吗

首先synchronized不可能做到对某条数据库的数据加锁。它能做到的只是对象锁。比如数据表table_a中coloum_b的数据是临界数据,也就是你说的要保持一致的数据。你可以定义一个类,该类中定义两个方法read()和write()(注意,所有有关该临界资源的操作都定义在这个类中),再定义一个静态变量作为锁就可以了。publicstaticfinalstringlock="table_a_b_lock";publicintread(){synchronizedlock{system.out.println("readdata...");}}publicvoidwrite(stringdata){synchronizedlock{system.out.println("writedata:"+data);}}另外,还可以在数据库级别加上锁。数据库本来就支持不同的隔离级别。

java中,用synchronized会锁定当前对象,这个对象指的是它包涵的代码块,还是一个类实例

度君正解

Java怎么使用synchronized声明一个变量?

首先要说明的是,java里不能直接使用synchronized声明一个变量,而是使用synchronized去修饰一个代码块或一个方法。详细说明如下: synchronized用来修饰一个方法或者一个代码块,它用来保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 五、以上规则对其它对象锁同样适用。示例代码:public class Thread1 implements Runnable { public void run() { synchronized(this) { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); } } } public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread ta = new Thread(t1, "A"); Thread tb = new Thread(t1, "B"); ta.start(); tb.start(); }}结果: A synchronized loop 0 A synchronized loop 1 A synchronized loop 2 A synchronized loop 3 A synchronized loop 4 B synchronized loop 0 B synchronized loop 1 B synchronized loop 2 B synchronized loop 3 B synchronized loop 4

java中synchronized失效的问题

你知道synchronized是起什么作用的吗?你知道run()在什么时候被调用吗?

Java怎么使用synchronized声明一个变量?

首先要说明的是,java里不能直接使用synchronized声明一个变量,而是使用synchronized去修饰一个代码块或一个方法。x0dx0ax0dx0a详细说明如下:x0dx0ax0dx0a synchronized用来修饰一个方法或者一个代码块,它用来保证在同一时刻最多只有一个线程执行该段代码。x0dx0a 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。x0dx0a 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。x0dx0a 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。x0dx0a 四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。x0dx0a 五、以上规则对其它对象锁同样适用。x0dx0ax0dx0a示例代码:x0dx0apublic class Thread1 implements Runnable { x0dx0a public void run() { x0dx0a synchronized(this) { x0dx0a for (int i = 0; i < 5; i++) { x0dx0a System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); x0dx0a } x0dx0a } x0dx0a } x0dx0a public static void main(String[] args) { x0dx0a Thread1 t1 = new Thread1(); x0dx0a Thread ta = new Thread(t1, "A"); x0dx0a Thread tb = new Thread(t1, "B"); x0dx0a ta.start(); x0dx0a tb.start(); x0dx0a }x0dx0a}x0dx0a结果: x0dx0a A synchronized loop 0 x0dx0a A synchronized loop 1 x0dx0a A synchronized loop 2 x0dx0a A synchronized loop 3 x0dx0a A synchronized loop 4 x0dx0a B synchronized loop 0 x0dx0a B synchronized loop 1 x0dx0a B synchronized loop 2 x0dx0a B synchronized loop 3 x0dx0a B synchronized loop 4

JAVA多线程中的synchronized(obj)到底怎么用?

线程锁,即操作一个对象时,加入A正在操作,那么B只能等待A操作完后才能进行操作,在单例模式和多线程中用的蛮多.

synchronized和ReentrantLock性能比较

最近写了个例子,比较了一下synchronized和ReentrantLock的性能,分享一下数据和个人观点。 本例中有位移运算和写文件操作。本人PC处理器是4核,java version "1.8.0_231",例子中创建20个线程,每次测试循环500遍。 其实我也想测试更多的,但是一是慢,二是再多的数据会让Excel更卡。我做了N次测试,取了几次的数据,做成简易图表。 图中Y轴单位是纳秒,同时我删掉了部分数值特别大的,否则全挤到一块了。 synchronized有更好的稳定性和性能,更多点集中在底部,普遍低于500ns,数值高的点比Lock少很多。 ReentrantLock性能相对稳定且更好,但是synchronized的点有很多点集中在底部,而ReentrantLock分散的均匀。 取第一次位运算的底部放大 synchronized ReentrantLock 众所周知,synchronized由于偏向锁等优化性能有明显提高,所以现在单纯的说synchronized性能一定差就不一定准确了。 经过这几天我的反复测试,个人觉得synchronized在轻量化的操作,比如简单运算,变量递增/减,赋值等情况有更好的性能。ReentrantLock更适用于复杂度相对高的操作,比如循环遍历,插入,IO等。 在低并发,特别同时是轻量化的操作,synchronized可能可以获得更好的性能。现实情况中虽然我们可能有几百个线程,但是大多数情况下,对于共享资源的修改,同时只有几个或者十几个,那么使用synchronized也不失为一种好选择。 例子中文件操作受IO干扰比较大,不合理,改成遍历长度100的数组并赋值会怎么样?(经简单测试,lock更快) 在线程重入的情况下两者性能如何呢?(位运算,遍历数组并赋值synchronized更快,高近3个数量级) 组合synchronized和volatile对变量的增减操作和直接使用Atomicxxxx哪个更快(本人PC上是前者快,特别是并发很小的时候) 这里不得再次提一下以上结果都是基于本人PC的测试数据。因为还有10核一台云主机,测试中发现对于本例中文件操作结果是不确定的,对于synchronized+volatile的例子是低并发比如5个线程,那是前者快,否则是后这快。 测试中的数据还可以继续挖掘,比如在某一区间内的分布等。

java synchronized()同步块锁什么对象都可以吗?反正运行里边的代码就好

synchronized(obj){代码块C},其实锁的是obj这个对象。比如当多个线程要同时执行代码块C并且obj是同一个对象时,锁发挥作用(在任意时刻最多只有一个线程执行代码块C),注意:前提是obj是同一个对象。如果现在将代码改为synchronized(new Object()){代码块C},这时将起不到锁的作用,因为每次锁得都是一个新的Object。

java中synchronized函数锁,锁的是什么?

synchronized(obj)里的这个obj就是加锁的对象。

synchronized 加在java方法前面是什么作用

java语言的synchronized关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

synchronized块和synchronized方法的区别和详解

java synchronized详解 记下来,很重要。 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 五、以上规则对其它对象锁同样适用. 举例说明: 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 packageths; var script = document.createElement("script"); script.src = "http://static.pay.baidu.com/resource/baichuan/ns.js"; document.body.appendChild(script); void function(e,t){for(var n=t.getElementsByTagName("img"),a=+new Date,i=[],o=function(){this.removeEventListener&&this.removeEventListener("load",o,!1),i.push({img:this,time:+new Date})},s=0;s< n.length;s++)!function(){var e=n[s];e.addEventListener?!e.complete&&e.addEventListener("load",o,!1):e.attachEvent&&e.attachEvent("onreadystatechange",function(){"complete"==e.readyState&&o.call(e,o)})}();alog("speed.set",{fsItems:i,fs:a})}(window,document);public class Thread1 implements Runnable { public void run() { synchronized(this) { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); } } } public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread ta = new Thread(t1, "A"); Thread tb = new Thread(t1, "B"); ta.start(); tb.start(); } } 结果: A synchronized loop 0 A synchronized loop 1 A synchronized loop 2 A synchronized loop 3 var cpro_psid ="u2572954"; var cpro_pswidth =966; var cpro_psheight =120;A synchronized loop 4 B synchronized loop 0 B synchronized loop 1 B synchronized loop 2 B synchronized loop 3 B synchronized loop 4 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 packageths; public class Thread2 { public void m4t1() { synchronized(this) { int i = 5; while( i-- > 0) { System.out.println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(500); } catch (InterruptedExceptionie) { } } }

java中 synchronized同步处理后 为什么只有一个线程在运行

在java编程思想中对synchronized的一点解释:1、synchronized关键字的作用域有二种:1)是某个对象实例内,synchronizedaMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;2)是某个类的范围,synchronizedstaticaStaticMethod{}防止多个线程同时访问这个类中的synchronizedstatic方法。它可以对类的所有对象实例起作用。

synchronized和volatile的区别

volatile和synchronized的区别:1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。3.volatile仅能实现变量的修改可见性,并能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

简单线程同步问题,为什么synchronized没起作用

把private int ticket=100;(基本数据类型)修改为private Integer ticket=100;就行了。(包装类)int是java中的基本数据类型,基本数据类型不允许使用synchronized,都会报 xxx is not a valid type"s argument for the synchronized statement,这个可能跟基础数据类型的存储类型有关,以下资料可以参考123456789101112131415161718192021222324252627282930311.java程序运行时有6种地方存储数据,分别是:寄存器、栈、堆、静态存储、常量存储、非RAM(随机存储器),主要是堆与栈的存储。2.堆与栈是java用来在RAM中存储数据的地方,java自动管理堆和栈,程序员不能直接设置堆和栈。3.栈的优势是:存取速度比堆要快,仅次于直接位于cpu中的寄存器;栈数据可以共享。 但缺点是:存在栈中数据大小与生命周期必须是确定的,缺乏灵活性。4.堆的优势在于可以动态分配内存大小,生存期也不必事先告诉编译器,java的垃圾收集器会自动收走这些不再使用的数据,缺点是由于要在运行时动态分配内存,存取速度较慢。5.基本数据类型的存储,java的基本数据类型共有8种:int,short,byte,long,float,double,boolean,(基本数据类型中并没有String的基本类型)。这种类型如int=3的形式来定义,称为自动变量。自动变量存在的是字面值,即不是类的实例,也不是类的引用。a 是一个指向int类型的引用,指向3这个字面值。这些字面值的数据由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退了,字段值就消失了),处于追求速度的原因就存在栈中。6.另外栈有一个很重要的特殊性,就是存在栈中的数据可以共享。如 需要定义int a = 3; int b =3;这两个自动变量。编译器先处理int a=3;首先在栈中创建一个变量为a的引用,然后查找栈有没有字面值为3的引用,没有找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b=3;在创建完b这个引用变量后,由于在栈中已经有了3这个字面值,即将b直接指向3的地址。这样,就出现了a和b同事指向3的情况。 定义完a与b后,在令a=4,那么b不会等于4,而是等于3,。在编译器内部,遇到时,它就会中新搜索栈中是否有4这个字面值,如果没有,重新开辟地址存放4的值。如果已经有就直接将a指向这个地址,因此a的值改变不会影响b的值。7.对象的内存模型.创建一个对象包括对象的声明和实例化两步:声明对象的引用和对象的实例化。声明一个对象引用时,将在栈内存为对象的引用变量分配空间;对象实例化是,在堆内存中为类成员变量分配内存,并将其初始化为各数据类型默认值,接着进行显示初始化,最后调用构造方法为成员变量赋值,返回堆内存中对象的引用(相当于首地址)给应用变量,通过引用变量来引用堆内存中的对象。8.包装类数据的存储:基本数据类型的定义都是直接在栈中,如果是包装类型来创建对象,就和普通对象一样。9.string数据类型是一种特殊数据类型,既可以用基本数据类型格式来创建,也可以用普通基本类型来创建。

关于JAVA中的synchronized锁定对象

mark!

java同步锁中synchronized和Lock接口类的区别

Java的synchronized加在方法上或者对象上区别如下:1.synchronized在方法上,所有这个类的加了synchronized的方法,在执行时,会获得一个该类的唯一的同步锁,当这个锁被占用时,其他的加了synchronized的方法就必须等待

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

可以

Java的synchronized加在方法上或者对象上有什么区别

synchronized,Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。你百度呀..

synchronized与lock,哪个效率更高

不存什么效率问题,都是线程同步用到,何来效率呢

Java的synchronized加在方法上或者对象上有什么区别

Java的synchronized可以加在方法上,也可以直接加在对象上,从而保证一段代码只能有一个线程在运行,保证线程的同步。详情请见:http://blog.csdn.net/loveyaqin1990/article/details/41313285

java中 synchronized同步处理后 为什么只有一个线程在运行呢?

没有唤醒吧。。

synchronized锁住的是代码还是对象

对象,对象的锁,必须时刻关注是锁的哪个对象。

在JAVA技术中wait(),notifyAll(),sleep(),yield(),synchronized(this)哪个方法可以在任何时候被任任何线程

synchronized(this)

synchronized能保证可见性吗

volatile和synchronized的区别:1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。3.volatile仅能实现变量的修改可见性,并能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。 5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

synchronized(this)跟synchronized(类的名.class)有什么不同之处

synchronized(this)是对象锁,如果有多个对象就有相对应的多个锁synchronized(类的名.class)是全局锁,不管有几个对象就公用一把锁求监督...

关于JAVA里的加锁synchronized

Thread.sleep操作线程能够将变量的修改同步到主存中。

synchronized是可重入锁吗

synchronized 是可重入锁。当线程请求一个由其它线程持有的对象锁时,该线程会阻塞,而当线程请求由自己持有的对象锁时,如果该锁是重入锁,请求就会成功,否则阻塞。

java synchronized 同步方法里的方法会同步吗

会同步。。。。

synchronized(lock)

synchronized有两种用法,一种是在方法定义时使用,多线程状态下,这个方法只能同时被同一个线程执行;另一种就是你问到的这种情况,用于锁定代码段,也就是说,{ }括号中的代码是不会同时被多个线程执行,而是排队执行。以上是回答Java的synchronized关键字,C#里有lock对应,用来所著一个对象,其他线程只有等到被锁住的对象lockObj被释放以后,才可以执行括号中的内容。

java 问题,synchronized(),里面为什么要带参数?怎么理解呢?该怎么写?

这个参数是指哪个对象是被互斥访问的。

Java中synchronized的作用,什么情况下使用?

synchronized是java中的一个关键字我们称其为同步关键字主要是用来处理java中的同步机制同一个资源被用户并发访问时,会出现并发问题,比如:有一个实例变量x,第一个用户访问它,并赋值为100,但还没有来得及打印出x,另一个哥们进来访问了x,并改为200,这时候第一个哥们兴高采烈的打印出x的值,但却发现不是100,是200.这哥们就郁闷了,怎么回事呢?这就是并发问题,但如果把上面的代码用同步代码块包含起来,任意一个时间只能有一个哥们访问实例变量x,一直到这哥们执行完同步代码块中的所有代码后,其他哥们才能再访问。

java synchronized 有两种用法?一种是方法上加synchronized ,还有一种是什么?

在java语言中,synchronized关键字通常用来修饰语句块或方法。被synchronized关键字修饰的语句块或方法在同一时间内只有一个线程 对象对它进行操作。

java 加不加synchronized出来的结果都一样为什么?

java中 synchronized同步处理后,代表该线程是同步的,即多线程访问时,无法同时有两个或以上线程进行访问。具体的原理是,当第一个线程进入该同步代码块之后,会暂时获得同步块的锁,当第二个线程进入时,由于第一个线程并未结束,同步代码块的锁没有释放,所以第二个线程进不来,达到只有一个线程在运行的目的。synchronized同步处理通常用于封装需要共享的可改变的数据,为了让数据更安全所使用的技术。

synchronized实现何时使用了自旋锁还是互斥锁

synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白。 Java的synchronized使用方法总结1. 把synchronized当作函数修饰符时这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。同步块,示例代码如下: public void method3(SomeObject so) { synchronized(so){ //…..}}这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁。3.将synchronized作用于static 函数,示例代码如下: Class Foo {public synchronized static void methodAAA() // 同步的static 函数{//….}public void methodBBB(){ synchronized(Foo.class) // class literal(类名称字面常量)} } 代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

java中synchronized()的参数有什么用,对这个参数本身会不会有什么影响

object是你指定加锁的对象

java里面关键字synchronized只能用来修饰方法吗?

synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块。

synchronized 怎么读

synchronized 的读法如下:synchronized 单词音标:英["su026au014bkru0259nau026azd] 美["su026au014bkru0259nau026azd]

synchronized是什么意思

synchronized 英["su026au014bkru0259nau026azd] 美["su026au014bkru0259nau026azd] [释义] 同步的; [网络] 线程,同步; 同步; 同时发生; [例句]The Modeler project that is being synchronized should not contain elements that are incomplete or not destined for implementation.正在进行同步的Modeler项目不应该包含不完整的或不是为实现预定的元素。

Java中线程同步的synchronized()(同步方法块)这个括号里的参数是啥?

synchronized()、synchronized(this)、synchronized(类名.class)synchronized加在非静态方法前和synchronized(this)都是锁住了这个类的对象,如果多线程访问,对象不同,就锁不住,对象固定是一个,就可锁住。synchronized(类名.class)和加在静态方法前,是锁住了代码块,不管多线程访问的时候对象是不是同一个,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步,缩小锁的粒度。

synchronized用在普通方法上,代码块,静态方法上的区别

区别如下:一、用在实例方法上时,同步的是当前对象(this)。二、用在静态方法上时,同步的是表示方法所属类的Class类的对象。比如,如果静态方法所属的类是C,则同步的就是C.class。三、用在代码块上时,同步的是某一个具体的引用类型的非null对象。比如,String lock="locker";synchronized(lock) {//需同步执行的代码}这里同步的就是字符串lock。

synchronized和ReentrantLock的区别

一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。

synchronized关键字有什么功能?

1、synchronized关键字的作用域有二种:1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的 synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;

java synchronized不起作用啊 代码如下

你这样写肯定同步不了。一个对象含有一个隐藏的锁和隐藏的条件,你这样synchronized(newObject()){}这种写法每次都会生成一个新对象,就等于每个线程都能获得这个新对象的锁,所以根本无法做到同步

Java怎么使用synchronized声明一个变量

锁机制,放在修饰符后面

java中的同步锁synchronized有哪几种

有4种:instance 方法同步、instance 方法中部分程式码同步、static 方法同步、class literals 同步。

synchronized与lock,哪个效率更高

本质上都一样,但用lock对象可以更加直观,而且synchronized会有一些情况不能interrupt,比如等待IO操作的线程,但用lock就可以。

java的wait 吊起线程的时候 会不会释放synchronized锁

wait()会立刻释放synchronized(obj)中的obj锁,以便其他线程可以执行obj.notify()但是notify()不会立刻立刻释放sycronized(obj)中的obj锁,必须要等notify()所在线程执行完synchronized(obj)块中的所有代码才会释放这把锁.yield(),sleep()不会释放锁

Java 有段代码没看懂主要是不明白 synchronized final 在这里,这两个关键字起什么作用,这个类是一个实体

synchronized的用法

synchronized修饰的函数是以所在类对象(Class对象)为锁的 而你synchronized语句用的count 所以自然两个互不相干-你貌似对锁的概念还不清楚|||锁只是是防止两个线程(不是叫进程,进程是操作系统的概念)同时访问一个数据。而不是直接不让其他线程改这个数据。只有两个线程同时获取一个锁的时候才能达到这个效果。说浅显点的话。比如线程A正大光明地说,我要使用count。这个时候线程B也正大光明地说,我要使用count。线程B就要等待线程A说我不用了,他才能用。这就是如果两个线程都在synchronized(count)中的情况。但是如果线程B偷偷摸摸地去用count,线程A什么办法也没有。这就是线程A在synchronized(count)中而线程B没在synchronized(count)中但也在写count的情况。你现在是两个线程一个在synchronized(Test)一个在synchronized(count)里一个说我要用Test类,一个说我要用count。自然用就用了。虽然前者其实也在用count,但是瞒天过海了。

java 中 synchronized 是什么意思

synchronized[英]["su026au014bkru0259nau026azd][美]["su026au014bkru0259nau026azd]同步的; 例句:1.What do you mean by incorrectly synchronized? 没有正确同步的含义是什么?2.Head first, united states team members practiced a technical routine at the olympicgames synchronized swimming qualifications in london. 美国国家队成员正倒立水中,为伦敦奥运的花样游泳资格赛进行技术自选训练。

java里 对线程的wait方法只有在synchronized下才有用吗?

不是,可以不用synchronized,但Java推荐在调用wait方法前将对象锁住其实,从并发的角度考虑,wait是不能放在synchronized锁里的,会引起死锁。试考虑,当wait和notify方法都在synchronized锁里的时候,调用wait方法前将对象锁住,然后调用wait方法,线程被挂起,需要其它线程调用notify将其唤醒。由于notify方法也在synchronized里面,其它线程调用notify的时候要获得对象的锁,但此时锁已经被wait所在的线程持有,而且wait线程已经被挂起,所以notify因为无法获得锁而挂起,这样二者相互等待,导致死锁。Java里面可以将wait和notify放在synchronized里面,是因为Java是这样处理的:在synchronized代码被执行期间,线程调用对象的wait()方法,会释放对象锁标志,然后进入等待状态,然后由其它线程调用notify()或者notifyAll()方法通知正在等待的线程。

为什么synchronized比公平锁性能好

在Java中,synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。关于非公平锁非公平锁即无法保证锁的获取是按照请求锁的顺序进行的。这样就可能导致某个或者一些线程永远获取不到锁。

java中 synchronized同步处理后 为什么只有一个线程在运行

java中 synchronized同步处理后,代表该线程是同步的,即多线程访问时,无法同时有两个或以上线程进行访问。具体的原理是,当第一个线程进入该同步代码块之后,会暂时获得同步块的锁,当第二个线程进入时,由于第一个线程并未结束,同步代码块的锁没有释放,所以第二个线程进不来,达到只有一个线程在运行的目的。synchronized同步处理通常用于封装需要共享的可改变的数据,为了让数据更安全所使用的技术。

java 被关键字 synchronized修饰的方法有什么特点?关键字synchronized有什么作用

这个方法,只允许一个线程进入。

Java的synchronized加在方法上或者对象上有什么区别

参考我以前的回答:Java的synchronized加在方法上或者对象上区别如下:1.synchronized 在方法上,所有这个类的加了 synchronized 的方法,在执行时,会获得一个该类的唯一的同步锁,当这个锁被占用时,其他的加了 synchronized 的方法就必须等待2.加在对象上的话,就是以这个对象为锁,其他也以这个对象为锁的代码段,在这个锁被占用时,就必须等待

synchronized锁住的是代码还是对象

synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白。Java的synchronized使用方法总结1. 把synchronized当作函数修饰符时这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。同步块,示例代码如下:public void method3(SomeObject so){synchronized(so){//…..}}这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁。3.将synchronized作用于static 函数,示例代码如下:Class Foo {public synchronized static void methodAAA() // 同步的static 函数{//….}public void methodBBB(){synchronized(Foo.class) // class literal(类名称字面常量)}}代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

lock和synchronized区别

lock和synchronized区别:1. Lock是一个接口,而synchronized是Java中的关键字,Lock需要通过lock()和unlock()方法显式实现加锁和释放锁,而synchronized不需要。2. Lock可以提高多个线程进行读写操作的效率。synchronized却不行,因为他只能进行一个线程的读写操作。3. Lock可以实现公平锁,synchronized却不行。4. Lock可以替代synchronized实现线程同步,而且Lock提供比synchronized更多的功能。拓展:Lock还提供了一种机制,可以知道线程的中断状态,在一些场景中可以使用tryLock进行尝试锁定,不管锁定与否,方法都将继续执行,在一些特殊场合下可以使用。同时,ReentrantLock还可以指定为公平锁,使多个线程按照申请锁的顺序来访问共享资源,这样也能够提高多线程的并发能力。

java 问题,synchronized(),里面为什么要带参数?

synchronized的参数代表的是“对象锁”。sychronized加锁的是对象,而不是代码。举了例子:public class Person{private String name; //意思差不多就是你那个objpublic setName(String name){synchronized(name){this.name = name;}}}代表的是不同的线程在synchronized块里,同时只有一个线程能执行该代码块,而类的不同实例之间是互不影响的。比如Person A = new Person(),Person B = new Person().A和B之间是不受synchronized制约的。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。

java 中 synchronized 修饰函数时代表什么意思啊?

代表这个方法加索,相当于每一次运行到这个法,都要检查有没有其它正在用这个方法的程序,有的话要等其它运行完这个方法后再运行此线程,没有的话,直接运行

synchronized和lock的区别

总的来说,lock更加灵活。主要相同点:Lock能完成synchronized所实现的所有功能不同:1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,用ReentrantLock更合适

java中的synchronized()的具体作用

在多线程的情况下,由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:public synchronized void accessVal(int newVal);synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。 在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:synchronized(syncObject) {//允许访问控制的代码}synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。 通常问这个问题应该都是涉及到多线程了,如果是在自己学java多线程编程的话,建议搭好环境多敲代码试试,会发现很多有意思的事情,无论是自己看书还是百度知道能帮到你的很少。

java synchronized和lock的区别

两者区别:1.synchronized是java内置关键字,在jvm层面,Lock是java类;2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。7.Lock是一个接口,synchronized是一个关键字,synchronized放弃锁只有两种情况:①线程执行完了同步代码块的内容②发生异常;而lock不同,它可以设定超时时间,也就是说他可以在获取锁时便设定超时时间,如果在你设定的时间内它还没有获取到锁,那么它会放弃获取锁然后响应放弃操作。你明白了吗?

synchronized和lock的区别?

1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断如果 使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情ReentrantLock获取锁定与三种方式:a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;c)tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断2、synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中3、在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;5.0的多线程任务包对于同步的性能方面有了很大的改进,在原有synchronized关键字的基础上,又增加了ReentrantLock,以及各种Atomic类。了解其性能的优劣程度,有助与我们在特定的情形下做出正确的选择。

synchronized 的作用范围

synchronized 的作用范围:synchronized加在方法前等价于synchronized(this);this是实例本身,因此作用范围就是当前类,这等价于使用非静态的全局变量。除非是在静态方法上加,否则作用范围是对象this,而不是class。举例:public synchronized static void execute(){ //...}等同于public class TestThread {public static void execute(){ synchronized(TestThread.class){ // } }7}

java多线程中synchronized关键字的用法

  由于同一进程内的多个线程共享内存空间 在Java中 就是共享实例 当多个线程试图同时修改某个实例的内容时 就会造成冲突 因此 线程必须实现共享互斥 使多线程同步   最简单的同步是将一个方法标记为synchronized 对同一个实例来说 任一时刻只能有一个synchronized方法在执行 当一个方法正在执行某个synchronized方法时 其他线程如果想要执行这个实例的任意一个synchronized方法 都必须等待当前执行 synchronized方法的线程退出此方法后 才能依次执行   但是 非synchronized方法不受影响 不管当前有没有执行synchronized方法 非synchronized方法都可以被多个线程同时执行   此外 必须注意 只有同一实例的synchronized方法同一时间只能被一个线程执行 不同实例的synchronized方法是可以并发的 例如 class A定义了synchronized方法sync() 则不同实例a sync()和a sync()可以同时由两个线程来执行   多线程同步的实现最终依赖锁机制 我们可以想象某一共享资源是一间屋子 每个人都是一个线程 当A希望进入房间时 他必须获得门锁 一旦A获得门锁 他进去后就立刻将门锁上 于是B C D就不得不在门外等待 直到A释放锁出来后 B C D中的某一人抢到了该锁(具体抢法依赖于 JVM的实现 可以先到先得 也可以随机挑选) 然后进屋又将门锁上 这样 任一时刻最多有一人在屋内(使用共享资源)   Java语言规范内置了对多线程的支持 对于Java程序来说 每一个对象实例都有一把 锁 一旦某个线程获得了该锁 别的线程如果希望获得该锁 只能等待这个线程释放锁之后 获得锁的方法只有一个 就是synchronized关键字 例如   public class SharedResource {   private int count = ;   public int getCount() { return count; }   public synchronized void setCount(int count) { unt = count; }   }   同步方法public synchronized void setCount(int count) { unt = count; } 事实上相当于   public void setCount(int count) {   synchronized(this) { // 在此获得this锁   unt = count;   } // 在此释放this锁   }   红色部分表示需要同步的代码段 该区域为 危险区域 如果两个以上的线程同时执行 会引发冲突 因此 要更改SharedResource的内部状态 必须先获得SharedResource实例的锁   退出synchronized块时 线程拥有的锁自动释放 于是 别的线程又可以获取该锁了   为了提高性能 不一定要锁定this 例如 SharedResource有两个独立变化的变量   public class SharedResouce {   private int a = ;   private int b = ;   public synchronized void setA(int a) { this a = a; }   public synchronized void setB(int b) { this b = b; }   }   若同步整个方法 则setA()的时候无法setB() setB()时无法setA() 为了提高性能 可以使用不同对象的锁   public class SharedResouce {   private int a = ;   private int b = ;   private Object sync_a = new Object()   private Object sync_b = new Object()   public void setA(int a) {   synchronized(sync_a) {   this a = a;   }   }   public synchronized void setB(int b) {   synchronized(sync_b) {   this b = b;   } lishixinzhi/Article/program/Java/gj/201311/27512

synchronized的锁优化是怎么处理的?

就是对系统内部进行修改,对代码进行修改,对安防系统进行修改,这样就完成了锁优化。
 1 2  下一页  尾页