java - java中的同步关键字和静态类

标签 java multithreading synchronize

我正在阅读(我相信)来自 IBM developerworks 网站的线程教程。在其中,他们谈到了 synchronized 关键字以及同步代码块如何被实际对象锁定,而不是代码块本身。

例如,在下面的代码中,作者声明即使静态类 'ThingiesetLastAccess 方法被列为同步的,它下面定义的两个线程每个人都可以同时调用 setLastAccess,因为他们对 thingie 使用不同的值。但是,如果 thingie 是静态的,这是否意味着它们使用的是相同的值?

是否变量名只需要不同,即使它们指的是同一个对象?

public class SyncExample {
    public static class Thingie {
        private Date lastAccess;
        public synchronized void setLastAccess(Date date) {
            this.lastAccess = date;
        }
    }
    public static class MyThread extends Thread {
        private Thingie thingie;
        public MyThread(Thingie thingie) {
            this.thingie = thingie;
        }
        public void run() {
            thingie.setLastAccess(new Date());
        }
    }
    public static void main() {
        Thingie thingie1 = new Thingie(),
        thingie2 = new Thingie();
        new MyThread(thingie1).start();
        new MyThread(thingie2).start();
    }
} 

最佳答案

您将静态方法 与静态 混淆了。如果 setLastAccess 是静态方法,那么如果它被标记为 synchronized,它将锁定在 Class 实例上ClassLoader——每个加载器只有一个。如果该方法是静态的和同步的,那么线程将锁定在同一个对象上。

但是,在您的示例中,Thingie 被标记为静态,而不是方法。 class 上的 static 关键字意味着 Thingie 不绑定(bind)到外部 SyncExample 类——它意味着只有一个 Thingie 实例并且它不影响同步。所以在你的例子中,当 setLastAccess 被标记为 synchronized 时,它锁定在 Thingie 类的实例上(this).由于有两个实例(thingie1thingie2),因此锁定在不同的对象上。显然,如果两个线程都在 thingie1 中传递,那么它们将锁定同一个对象。

这里有一些阅读:

关于java - java中的同步关键字和静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811701/

相关文章:

java - 如何避免将内容写入文件时的同步问题 - Java(android)

java - 无法构建 Shopizer 项目

java - 使用动态名称创建变量 - Java

multithreading - 1024 个 CPU 的内核调度

cuda - 将设备内存访问与主机线程同步

java - 返回迭代器而不是集合

java - 类型不匹配 : cannot convert from element type Object to int

java - 有关套接字和黑莓的帮助

java - 在多个线程中调用相同的API

java - Java 中的 Volatile 关键字