Integer不能作为synchronized的对象吗

 

public class SychronizedTest implements Runnable {
	
	private Timer t = new Timer();

	public static void main(String[] args) {
		
		SychronizedTest st = new SychronizedTest();

		Thread thread1 = new Thread(st, "Thread1");
		Thread thread2 = new Thread(st, "Thread2");

		thread1.start();
		thread2.start();
	}

	public void run() {
		this.t.add();
	}
}

class Timer {
	private Integer i = 0;
	
	private Object o = new Object();

	public void add() {
		//i 没有被2个线程竞争,2个线程都可以获得对i的锁,但是如果换成o,则一个线程等待一个线程阻塞
		//synchronized (o) {
		synchronized (i) {
			this.i++;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("您是第" + this.i + "个使用i的线程," + Thread.currentThread().getName());

		}
	}
}

 //i 没有被2个线程竞争,2个线程都可以获得对i的锁,但是如果换成o,则一个线程等待一个线程阻塞

 

有点奇怪,换成atmoicinteger也是可以的,观察线程栈也可以说明这一点

 

"Thread2" prio=6 tid=0x17122400 nid=0x1d18 at breakpoint[0x172df000]
   java.lang.Thread.State: RUNNABLE
	at com.google.prophet.quickstart.basic.thread.Timer.add(SychronizedTest.java:34)
	- locked <0x02fb05c8> (a java.lang.Integer)
	at com.google.prophet.quickstart.basic.thread.SychronizedTest.run(SychronizedTest.java:19)
	at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
	- None

"Thread1" prio=6 tid=0x17121800 nid=0x18b8 at breakpoint[0x1728f000]
   java.lang.Thread.State: RUNNABLE
	at com.google.prophet.quickstart.basic.thread.Timer.add(SychronizedTest.java:34)
	- locked <0x02fb05f8> (a java.lang.Integer)
	at com.google.prophet.quickstart.basic.thread.SychronizedTest.run(SychronizedTest.java:19)
	at java.lang.Thread.run(Thread.java:662)

   Locked ownable synchronizers:
	- None
 

 

0x02fb05f8
0x02fb05c8

  Integer是一个对象但是id却不同,可能这个Integer各自在2个线程的工作内存中,而不是共享内存中,目前我只能这么解释,而Object,或者是AtomicInteger则是创建在了共享内存中,所以可以进行同步。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值