为什么我的所有线程都使用同一个锁?

问题描述 投票:0回答:1

我最近遇到了这段代码片段

class Counter2 implements Runnable{

    private int value = 0;

    
    private Integer lock = 0;

    

    public void increment(){
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        value++;
    }

    public void decrement(){
        value--;
    }

    public int getValue() {
        return value;
    }

    @Override
    public void run() {
        synchronized(lock) {
            this.increment();
            System.out.println(String.format("%s incremented value, value = %s", Thread.currentThread().getName(), this.value));
            this.decrement();
            System.out.println(String.format("%s decremented value, value = %s", Thread.currentThread().getName(), this.value));
        }
    }
}
public class Part8_synchronized_keyword_1 {
    
    public static void main(String[] args) {
        Counter2 counter = new Counter2();
        new Thread(counter,"Thread1").start();
        new Thread(counter,"Thread2").start();
        new Thread(counter,"Thread3").start();
        new Thread(counter,"Thread4").start();
        Counter2 counterB = new Counter2();
        new Thread(counterB, "ThreadB").start();

    }
}

我得到如下输出

Thread1 incremented value, value = 1
Thread1 decremented value, value = 0
ThreadB incremented value, value = 1
ThreadB decremented value, value = 0
Thread4 incremented value, value = 1
Thread4 decremented value, value = 0
Thread3 incremented value, value = 1
Thread3 decremented value, value = 0
Thread2 incremented value, value = 1
Thread2 decremented value, value = 0

为什么threadB好像在和thread1...4竞争同一个锁?。 因为根据我的理解,锁对象对于 counterB 和 counter

是不同的
java concurrency synchronized
1个回答
2
投票

你假设

counter
counterB
使用不同的锁是错误的.

为什么:因为你声明你的锁为

private Integer lock = 0;

并且 JVM 缓存

Integer
对象的所有值从 -128 到 127.

声明你的锁为

private Object lock = new Object();

只有这样

counter
counterB
才会使用不同的锁!

© www.soinside.com 2019 - 2024. All rights reserved.