理解java中的synchronized关键字

1.理解sysnchronized的含义,明确synchronized关键字修饰普通方法,静态方法和代码块时锁对象的差异
如下有个类

   class A{
     public synchronize void a(){
     }
     
     public synchronize void b(){
     }
   }
   
   然后创建两个对象
   A a1 = new A();
   A a2 = new A();
   
   然后在两个线程中并发访问如下代码:
   Thread1    Thread2
   a1.a();        a2.a();

   能否构成线程同步?

  情况二:
   class A{
     public static synchronize void a(){
     }
     
     public static synchronize void b(){
     }
   }
  此时在多线程中能否同步?

关于synchronized使用的场景:
 1.synchronized修饰普通方法public synchronized void memberMethod(){};
   调用普通类的方法,需要创建该类的实列对象来调用,那么当我们调用synchronized方法时,此时用到的锁就是对象锁。也就是该类的实列对象.
   所以在不同的线程中,使用不同的对象实列,不能构成同步
 2.synchronized修饰静态方法pulbic static synchronized void memberMethod(){};
   调用静态方法只需要使用类名加方法就可以,当调用静态的synchronized方法时,此时用到的锁就是该方法类的对象。用的是类锁,
   所以能构成同步,
 3.synchronized代码块,使用代码有3种情况
   I . synchronized(对象){} 
   II . synchronized(类名.class){} 
   III. synchronized(this){}
   如果使用this的话,此时用的锁是该代码块所在方法的实列对象,相当于对象锁一样,所以不能构成同步,因为多个对象,多个实列
   如果使用类名.class 此时用的锁是类锁,可以构成同步
   如果使用的是对象,此时用的锁是对象锁,只需要保持这个对象锁是唯一,多个实列中都用的是同一个对象锁,此时就可以构成同步
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容