欢迎来到天天文库
浏览记录
ID:37710707
大小:36.50 KB
页数:3页
时间:2019-05-29
《Java的synchronized关键字》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、·Java的synchronized关键字:同步机制总结JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程式。不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话。JAVA的synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、objectre
2、ference(对象引用)、static函数和classliterals(类名称字面常量)身上。在进一步阐述之前,我们需要明确几点:A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。B.每个对象只有一个锁(lock)和之相关联。C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。接着来讨论synchronized用到不同地方对代码产生的影响:假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法
3、,P1、P2就都能够调用他们。Java的synchronized使用方法总结1. 把synchronized当作函数修饰符时,示例代码如下:1.Public synchronized void method(){ 2.//…. 3.} 这也就是同步方法,那这时synchronized锁定的是哪个对象呢?他锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,他们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。上边的示例代码等同于
4、如下代码:4.public void method() 5.{ 6.synchronized (this) // (1) 7.{ 1. //….. 2.} 3.} (1)处的this指的是什么呢?他指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于objectreference。――那个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程式也可能在这种情形下摆脱同步机制的控制,造成数据混乱。2.同步块,示例代码如下:4.public void met
5、hod(SomeObject so) { 5.synchronized(so) 6.{ 7. //….. 8.} 9.} 这时,锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:10.class Foo implements Runnable 11.{ 12. private byte[] lock = new byte[0]; // 特别的ins
6、tance变量 13. Public void method() 14.{ 15. synchronized(lock) { //… } 16.} 17.//….. 18.} 注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Objectlock=newObject()则需要7行操作码。3.将synchronized作用于static函数,示例代码如下:19.Class Foo 20.{ 21.public synchronized static vo
7、id method1() // 同步的static 函数 22.{ 1.//…. 2.} 3.public void method2() 4.{ 5. synchronized(Foo.class) // class literal(类名称字面常量) 6.} 7. } 代码中的method2()方法是把classliteral作为锁的情况,他和同步的static函数产生的效果是相同的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。记得在《Effe
8、ctiveJava》一书中看到过将Fo
此文档下载收益归作者所有