java中同步_避免在Java中同步(这个)?

当您使用同步(此)时,您将类实例用作锁本身。这意味着当锁由线程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),从而允许更好的并发性,另一方面,它变得比第一个示例更加复杂.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值