【Java】Sychronized的作用范围和注意事项

一共分为三个范围:

  • 作用某对象上,例如
synchronized (this)、synchronized (object)
  • 作用在某方法上,例如:
public void test()
  • 作用在类上,例如:
public synchronized static void test()

② synchronized(SynchronizeDemo.class) {
              ...
   }

不过还要注意下几个问题:

1》【synchronized(this) 】表示锁住了当前对象,那么当前对象是否可以访问其他方法呢?

可以!当一个线程访问该【synchronized(this)】同步代码块时,其他线程可以访问其他方法

2》【synchronized(this)】锁住当前对象,自然使用同一个对象访问同一临界区会发生阻塞。

但是如果换一个对象访问临界区,或同一对象访问非当前临界区,都可以正常访问,不会发生线程阻塞。

3》【public synchronized static void test()】这种采用static修饰的静态方法主要是类锁,即锁住后会锁住全部对象,

对象之间互斥。当多个对象并发执行此方法时,需要排队。

4》synchronized不能继承,父类的synchronized方法被子类继承后,默认不是synchronized的,必须手动用synchronized修饰方法。

并且接口中的方法不可以用synchronized修饰

构造方法不能加synchronized关键字,加了编译器也会报错,并且new对象的过程采用了CAS等方式保证了并发安全性

原文地址:https://www.cnblogs.com/boluopabo/p/13088028.html