Java同步游戏:synchronized \u0026\u0026 wait \u0026\u0026 notify

Java同步游戏:synchronized \u0026\u0026 wait \u0026\u0026 notify,第1张

概述我来自.NET世界,不幸的是用.NET的眼睛看Java源代码.以下代码来自Android应用程序(虽然根本不是Android特定的):privateclassWorkerimplementsRunnable{privatefinalObjectmLock=newObject();privateLoopermLooper;Worker(Stringna

我来自.NET世界,不幸的是用.NET的眼睛看Java源代码.

以下代码来自Android应用程序(虽然根本不是AndroID特定的):

    private class Worker implements Runnable {        private final Object mlock = new Object();        private Looper mLooper;        Worker(String name) {            Thread t = new Thread(null, this, name);            t.start();            synchronized (mlock) {                while (mLooper == null) {                    try {                        mlock.wait();                    } catch (InterruptedException ex) {                    }                }            }        }        public Looper getLooper() {            return mLooper;        }        public voID run() {            synchronized (mlock) {                Looper.prepare();                mLooper = Looper.myLooper();                mlock.notifyAll();            }            Looper.loop();        }        public voID quit() {            mLooper.quit();        }    }

我不清楚同步的工作原理.
首先我认为synchronized是锁定mlock对象,但是如果在t.start()构造函数线程首先进入同步块之后,它将在mlock.wait()中阻止它,并通过阻止它进入synchronized来隐式阻止线程“t”块.

这显然是错误的,因为我的电话按照假设:)

接下来想到同步同步“代码块”(在这种情况下,有两个同步块是独立的=>线程可以同时无限制地输入两个不同的同步块),并且完全适合…

…直到我的同事告诉我mlock.wait()释放锁定mlock并允许其他线程同时进入mlock的关键部分.

我不确定我是否足够清楚,所以很乐意回答任何进一步的问题.

解决方法:

查看Object.wait()上的javadoc.这是“神奇的”,因为它会丢弃进入synchronized {}块时获取的监视器.这允许另一个线程获取监视器并调用Object.notify().

当另一个线程调用notify()从wait()调用中唤醒等待线程时,等待线程必须重新获取监视器并将阻塞直到它可以 – 监视器仅在wait()调用期间被丢弃.并且通知线程在新唤醒的等待线程可以继续之前完成其同步块.一切都按可预测顺序排列.

总结

以上是内存溢出为你收集整理的Java同步游戏:synchronized \u0026\u0026 wait \u0026\u0026 notify全部内容,希望文章能够帮你解决Java同步游戏:synchronized \u0026\u0026 wait \u0026\u0026 notify所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1115842.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存