【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等方式保证了并发安全性。
学而不思则罔 思而不学则殆 !