新手 Java 多线程

假如 A线程 调用了obj.wait() ,之后B线程 调用了obj.wait(),待B线程执行完synchronized(obj)代码块释放 obj锁。此时A线程拿到obj锁 继续运行线程 ,这之后A线程会一直拿着obj锁吗,还是被拿到锁 被唤醒后就 把锁释放了

0

3个回答

怎么又是你,A在wait后如果不被notify是不能竞争锁的。锁的所有时间只在synchronized花括号内,花括号内肯定有锁,出去肯定没有,但是锁被释放后执行wait的线程无法获得锁,必须先被别的线程notify才能获取锁

0
weixin_41423378
银翼的魔术师s 懂了 ,大佬 感谢
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 22行的synchronized语句块在25行wait阻塞并重新获得锁之后,运行到29行synchronized语句块结束时释放锁
11 个月之前 回复
weixin_41423378
银翼的魔术师s 老哥我举了个例子,看下下面的图吧 , 拿着锁,没遇到synchronized和obj.wait
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 拿着锁,直到synchronized语句块结束或者遇到obj.wait
11 个月之前 回复
weixin_41423378
银翼的魔术师s A线程 调用了obj.wait() 后不是要拿到obj的锁继续 才能运行吗,那之后A线程是一直拿着锁还是怎么样
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 我说的是锁释放只发生在synchronized语句块结束或者obj.wait,其他情况不会释放,你不懂的在哪里
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 拿到锁了就意味着早就唤醒了啊,为什么还会有被唤醒后就把锁释放了这种想法
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 不是,我没动你说的被拿到锁是什么意思,还有你所说的锁释放是发生在什么语句下的
11 个月之前 回复
weixin_41423378
银翼的魔术师s 老哥这么较真的吗 , 那notify 又刚好拿到锁 这之后A线程会一直拿着obj锁吗,还是被拿到锁 被唤醒后就 把锁释放了
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 被唤醒不代表可以立即拿到锁,而是在锁空出来的时候可以竞争,拿到锁之后除了wait,只要不出synchronized都不会释放锁
11 个月之前 回复
weixin_41423378
银翼的魔术师s 额 这么巧,我知道要notify 只是之后 A线程拿到obj锁 继续运行线程 ,这之后A线程会一直拿着obj锁吗,还是被拿到锁 被唤醒后就 把锁释放了
11 个月之前 回复

写了一个小例子, 你自己反复运行几次, 试着按你自己的理解去改一改逻辑, 很快你就明白了


import static java.lang.Thread.sleep;

public class ABTest {

    private static  Object obj = new Object();

    private static class ThreadA extends Thread{
        public void run() {
            System.out.println("a started");

            synchronized (obj){
                System.out.println("A do something and then wait");

                obj.notify();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("a finished");
        }
    }
    private static class ThreadB extends Thread{
        public void run() {
            System.out.println("b started");

            synchronized (obj){
                System.out.println("B do something and then wait");
                try {
                    sleep(100);
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                obj.notify();

            }

            System.out.println("b finished");
        }
    }


    public static  void main(String [] args) throws InterruptedException {
        Thread a = new ThreadA();
        Thread b = new ThreadB();
        a.start();
        b.start();

        synchronized (obj) {
            sleep(1000);
            System.out.println("main finished!");
            obj.notify();
        }
    }
}
0

图片说明

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!