使用同步 (obj) 和声明的锁之间的差异



我正在尝试同步这个run()方法。我希望一次只有一个线程进入其中,但我不明白为什么解决方案告诉我使用 syncd(obj) 方法:

public Tabellina(Contatore o, int num) {
    obj = o; 
    numero = num;
    r = new Random(); 
    start();
}
public void run() {
    synchronized(obj) {
        for (int j=0; j<10; j++) {
            obj.incr();
            try { 
                Thread.sleep(100);
            } catch (InterruptedException e) { }
            System.out.println(Thread.currentThread().getName() + ": " + obj.getVal());
        }
        try { 
            Thread.sleep(r.nextInt(2000));
        } catch (InterruptedException e) { }
    }}
}

我的想法是创建一个锁并通过以下方式同步它:

public Tabellina(Contatore o, int num) {
    obj = o; 
    numero = num;
    r = new Random(); 
    l1 = new ReentrantLock();
    start();
}
public synchronized void run() {
    l1.lock();
        for (int j=0; j<10; j++) {
            obj.incr();
            try { 
                Thread.sleep(100);
            } catch (InterruptedException e) { }
            System.out.println(Thread.currentThread().getName() + ": " + obj.getVal());
        }
        try { 
            Thread.sleep(r.nextInt(2000));
        } catch (InterruptedException e) { }
    l1.unlock();
    }
}

但它不起作用,因为线程交替打印 for 的内容。怎么可能?如果我在运行方法开始时使用 lock() 不应该第一个线程完成 for 然后释放锁并让第二个线程进入该方法吗?

使用

public synchronized void run() {

是 的简写

public void run() {
    synchronized (this) {

由于每个带有锁的对象this不同,因此它们彼此独立。换句话说,它对你的情况没有任何作用。

相关内容

最新更新