Java 同步游戏 : synchronized && wait && notify

标签 java android multithreading synchronization

我来自 .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 是如何工作的。 一开始我以为synchronized是锁定mLock对象,但是如果t.start()构造线程先进入同步块(synchronized block),它会阻塞在mLock.wait() ,并通过阻止线程“t”进入同步块(synchronized block)来隐式阻止线程“t”。

这显然是错误的,因为我的电话响了 :)

接下来想到的是 synchronize 同步“代码块”(在这种情况下,两个同步块(synchronized block)是独立的 => 线程可以不受限制地同时进入两个不同的同步块(synchronized block)),并且非常适合...

... 直到我的同事告诉我 mLock.wait() 释放了 mLock 上的锁并使其他线程同时进入 mLock 上的临界区。

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

最佳答案

查看 Object.wait() 上的 javadoc .它的“魔力”在于它删除了进入同步 {} block 时获取的监视器。这允许另一个线程获取监视器并调用 Object.notify() .

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

关于Java 同步游戏 : synchronized && wait && notify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1922224/

相关文章:

c++ - 在多线程中初始化 vector

java - 如何获取 Activity 的 View ?

java - Android second layer on running camera app

android - 如何从外部更改 recyclerview 项目的布局?

java - java中多线程的概念

java嵌套Map数据结构读写操作

java - 将 Hibernate 对象序列化为 JSON 时抛出异常

java - 当我使用查询参数注入(inject)数据时,Jax-rs Jersey 客户端给出空值

java - 使用私钥身份验证确保 FTP 安全

java - Android DownloadManager 获取文件名