synchronized内必须要用对象锁吗?

来源:7-2 wait方法

96年的nash

2019-10-12

//对象锁
private static Object object = new Object();
private static Object object2 = new Object();

//实例对象

static class Thread1 extends Thread{

    @Override
    public void run() {
        synchronized (object){
            System.out.println(Thread.currentThread().getName() + "开始执行了");
            try {
                object.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //执行到这一行,表示线程此时又重新拿到了锁
            System.out.println("线程"+Thread.currentThread().getName() + "获取到了锁");
        }
    }
}

static class Thread2 extends Thread{

    @Override
    public void run() {
        synchronized (object){
            //唤醒thread1
            object.notify();
            //此时,依然会执行以下代码,而不是执行thread0,因为此时thread1依然拥有这把锁
            System.out.println("线程"+Thread.currentThread().getName() + "调用了notify");
        }
    }
}

我看老师的代码内都是选用的对象锁,是因为一个类中的不同实例拥有不同的对象锁,而只能有一把类锁吗?而object.wait()和object.notify(),就是对象锁执行了wait和notify方法,notify只能随机唤醒等待同一把对象锁的线程,是这个意思吗老师?

写回答

1回答

悟空

2019-10-12

用对象锁可以自由控制锁住的对象。

object.wait()和object.notify(),就是对象锁执行了wait和notify方法,notify只能随机唤醒等待同一把对象锁的线程

对的,只能唤醒相对应的锁。


synchronized内必须要用对象锁

这个不是必须的

0
1
96年的nash
明白了,感谢悟空老师!
2019-10-12
共1条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程