Synchronzied锁对象之包装类

13 篇文章 0 订阅

synchronized锁对象为包装类型(修饰变量)

synchronized锁对象为包装类型时,需要考虑包装类型的缓存,如Integer默认缓存-127~128之间的数值,所以下例中锁a和锁b实际锁的是同一个对象;另外其它包装类也需要注意类似问题(如Byte/Short);

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

public static Short valueOf(short s) {
final int offset = 128;
int sAsInt = s;
if (sAsInt >= -128 && sAsInt <= 127) { // must cache
return ShortCache.cache[sAsInt + offset];
}
return new Short(s);
}
public class ConcurrentTest {
private Integer a = 100;
private Integer b = 100;

public static void main(String[] args) throws InterruptedException {
ConcurrentTest test = new ConcurrentTest();
test.testA();
test.testB();
System.err.println("a:"+ test.a);
System.err.println("b:"+ test.b);
}

private void testA() {
new Thread(() -> {
System.err.println("A thread started");
synchronized (a) {
for (int i = 0; i < 10; i++) {
System.err.println("a =>");
sleep(1);
}
}
}).start();
}

private void testB() {
new Thread(() -> {
System.err.println("B thread started");
synchronized (b){
for (int i = 0; i < 10; i++) {
System.err.println("b =>");
sleep(1);
}
}
}).start();
}
}
out==> //实际输出是等打印完a才打印b
A thread started
a =>
B thread started
a =>
a =>
a =>
a =>
a =>
a =>
a =>
a =>
a =>
b =>
b =>
b =>
b =>
b =>

当然实际开发过程中一般也不会使用包装类做锁对象!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值