讨论Java中static synchronized和synchronizedITeye - 千亿集团

讨论Java中static synchronized和synchronizedITeye

2019年04月01日08时42分21秒 | 作者: 丹蝶 | 标签: 办法,拜访,线程 | 浏览: 982

仿制代码 synchronized的规模是某个类的目标/实例,避免多个线程一起拜访同一个类目标/实例的synchronized代码块。 static synchronized当地规模是某个类,避免多个线程一起拜访这个类的synchronized代码块。

知道差异今后看看标题:

1.出自并发编程网:

按 Ctrl+C 仿制代码 按 Ctrl+C 仿制代码

问题:

线程1拜访A.staticWrite(true)办法时,线程2能拜访A.staticRead()办法吗? 线程1拜访new A().staticWrite(false)办法时,线程2能拜访new A().staticRead()办法吗? 线程1拜访A.staticWrite(false)办法时,线程2能拜访new A().staticRead()办法吗?

答案是都不能。由于不管A创立多少个目标或实例,任一目标调用staticWrite(),或类直接调用staticWrite(),锁目标的引证都是A.class。也便是只需调用staticWrite办法,都会对A.class加锁,而staticRead()需求取得的锁目标也正是A.class,因而会呈现堵塞。所以线程2无法拜访A.staticRead()办法。

A a=new A(); 线程1拜访a.write(false)办法,线程2能拜访a.read()办法吗? A a=new A(); A b=new A();线程1拜访a.write(false)办法,线程2能拜访b.read()办法吗?

标题1答案是不能够,理由与上面相似。a.write()对类A的目标a加了锁,而a.read()需求取得的锁目标也刚好是a,所以线程2无法拜访a.read()

标题2答案是能够,a.write()对类A的目标加了锁,而b.read()需求取得的锁目标则是b,两者无抵触。b.read()能顺畅取得锁,并拜访read()办法。

再次总结:

关于实例同步办法,锁是当时实例目标。 关于静态同步办法,锁是当时目标的Class目标。 关于同步办法块,锁是Synchonized括号里装备的目标。

 

再看一题,出自日本作者-结成浩的《java多线程规划形式》:

1 pulbic class Something(){
2 public synchronized void isSyncA(){}
3 public synchronized void isSyncB(){}
4 public static synchronized void cSyncA(){}
5 public static synchronized void cSyncB(){}
6 }

有Something类的两个实例x与y,那么下列组办法何故被1个以上线程一起拜访呢
   a.   x.isSyncA()与x.isSyncB() 
   b.   x.isSyncA()与y.isSyncA()
   c.   x.cSyncA()与y.cSyncB()
   d.   x.isSyncA()与Something.cSyncA()

有了上面的常识,很简单判别a,c不能,而b能够。d略微剖析一下,也能够确认能够被1个以上线程一起拜访,因而x.isSyncA()锁的是Something的目标x,而Something.cSyncA()锁的是Something.class。

最终要留心的是:synchronized并不能承继,子类掩盖父类synchronized办法时,必定也要在前面加上synchronized关键字;但子类未重写该办法,实例化子类,调用对应办法,也会加锁

这篇文章对synchronized关键字做了深化的总结,值得细心了解。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章