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则是创建在了共享内存中,所以可以进行同步。

 

你可能感兴趣的:(Java基础)