Java同步机制浅谈

Java同步机制浅谈

ID:46049291

大小:67.33 KB

页数:4页

时间:2019-11-20

Java同步机制浅谈_第1页
Java同步机制浅谈_第2页
Java同步机制浅谈_第3页
Java同步机制浅谈_第4页
资源描述:

《Java同步机制浅谈》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java同步机制浅谈synchronized对代码作何影响?synchronizedJava对多线程的支持与同步机制深受人家的喜爱,似乎看起來使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题.到底如何?一一还得对synchronized关键字的作用进行深入了解才可定论.总的说來synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块•如果再细的分类synchronized可作用Tinstance变ft,objectreference(对彖引用),static函数和classliterals(类名称字

2、面常量)身上.在进一步阐述之前,我们需要明确几点:A.无论synchronized关键字加在方法上还是对彖上,它取得的锁都是对象,而不是把一段代码或函数当作锁一一而且同步方法很可能还会被具他线程的对象访问.B.每个对象只有一个锁(lock)与Z相关联.C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制.接着来讨论synchronized用到不同地方对代码产生的影响:假设P1,P2是同一个类的不同对象,这个类屮定义了以下儿种情况的同步块或同步方法,P1,P2就都可以调用它们.1.把synchronized当作函数修饰符时,示例代码如下:Pub

3、licsynchronizedvoidmethodAAA(){仏...}这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象•也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果.但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法.上边的示例代码等同于如下代码:publicvoidmethodAAA(){synchronized(this)//(l){//..…}}⑴处的this指的是什么呢?它指的就是调用这个方法的对象,如P1.可见

4、同步方法实质是将synchronized作用于objectreference.那个拿到了P1对彖锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它書不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱:(2.同步块,示例代码如下:publicvoidmethod3(SomeObjectso){synchronized(so){//}}这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码.当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)

5、來充当锁:classFooimplementsRunnable{privatebyte[]lock=newbyte[O];//特殊的instance变量PublicvoidmethodA(){synchronized(lock){//...}}//}注:零长度的byte数组对彖创建起来将比任何对彖都经济-一查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Objectlock二newObject0则需要7行操作码.3.将synchronized作用于static函数,示例代码如下:ClassFoo{publicsynchronizedstaticvoidmet

6、hodAAA()//同步的static函数{//....}publicvoidmethodBBB(){synchronized(Foo.class)//classliteral(类名称字面常量)}}代码中的methodBBB()方法是把classliteral作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了).记得在《EffectiveJava》一书屮看到过将Foo.class和Pl.getClass()用于作同步锁还不一样,不能用Pl.getClass()来

7、达到锁这个Class的目的.Pl指的是由Foo类产生的对象.可以推断:如果一个类中定义了一个synchronized的static函数A,也定;L艘桓?synchronized的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样.A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class.小结如下:搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序.还有一些技巧可以让我们对共享资源的同步访问更加安

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。