Java核心复习 —— 锁

Synchronized

一道面试题

同一个对象在A、B两个线程中分别访问该对象的两个同步方法writer和reader,是否会产生互斥?


class LockDemo{
	
	int a = 0;
	
	public synchronized void writer(){
		sleep(10);
		a++;
	}
	
	public synchronized void reader(){
		int i = a;
	}
	
	public static void main(String[] args) {
	
        Test test = new Test();
        new Thread(() -> {
            test.writer();
        }).start();
        
        sleep(1);
        
        new Thread(() -> {
            test.reader();
        }).start();

    }

}


答案:会。因为synchronized修饰的是方法,锁是对象锁,默认当前的对象作为锁的对象。只有当A释放锁之后,B才会获得对象的锁。

(1)如果是换成是不同对象呢?

不会互斥,因为锁的是对象,而不是方法

(2)如果writer、reader方法加上static修饰,两个线程中,类直接调用两个方法呢?

会互斥,因为锁的是Class对象。

(3)如果writer方法用static修饰,reader方法不用呢?

不会互斥。因为一个是对象锁,一个是Class对象锁,锁的类型不同。

synchronized修饰位置与锁的关系

  • 同步方法 —— 对象锁,当前实例对象
  • 静态同步方法 —— 类对象锁,当前对象的Class对象
  • 同步方法块 —— 对象锁,synchonized括号里配置的对象

猜你喜欢

转载自blog.csdn.net/weixin_42142408/article/details/88960810