我最近遇到了这段代码片段
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
是不同的你假设
counter
和counterB
使用不同的锁是错误的.
为什么:因为你声明你的锁为
private Integer lock = 0;
并且 JVM 缓存
Integer
对象的所有值从 -128 到 127.
声明你的锁为
private Object lock = new Object();
只有这样
counter
和counterB
才会使用不同的锁!