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

lar*_*ryq 1 java multithreading synchronize

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

例如,在下面的代码中,作者声明即使静态类ThingiesetLastAccess方法被列为同步,下面定义的两个线程也可以setLastAccess同时调用,因为它们使用的是不同的值.但是,如果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();
    }
} 
Run Code Online (Sandbox Code Playgroud)

Gra*_*ray 6

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

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

这里有一些阅读: