当您使用同步(此)时,您将类实例用作锁本身。这意味着当锁由线程1获得时,线程2应该等待。
假设以下代码public void method1() {
do something ...
synchronized(this) {
a ++;
}
................}public void method2() {
do something ...
synchronized(this) {
b ++;
}
................}
方法1修改变量a和方法2修改变量b,应该避免由两个线程并发修改同一个变量。但当螺纹1改性a和螺纹2改性b它可以在没有任何比赛条件的情况下执行。
不幸的是,上面的代码将不允许这样做,因为我们对锁使用相同的引用;这意味着,即使线程不处于竞争状态,也应该等待,而且显然代码牺牲了程序的并发性。
解决办法是使用2不同锁二不同的变量。class Test {
private Object lockA = new Object();
private Object lockB = new Object();public void method1() {
do something ...
synchronized(lockA) {
a ++;
}
................}public void method2() {
do something ...
synchronized(lockB) {
b ++;
}
................
}
上面的示例使用更细粒度的锁(2个锁而不是一个(洛卡和锁B变量a和b),从而允许更好的并发性,另一方面,它变得比第一个示例更加复杂.