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