package function.thread;
class ThreadDemo1 implements Runnable {
public void run() {
// 为了更清楚地看到不正确的结果,这里放一个大的循环
String ThreadName = Thread.currentThread().getName();
if (ThreadName.equals("Thread-0")) {
System.out.println(ThreadName+" enter synchronized before.....\n");
synchronized (this) {//锁住的不是当前整个对象,而是和当前对象里同步相关的内容
System.out.println(ThreadName+" enter.....");
try {
for(int i = 0;i<10;i++){
System.out.println(ThreadName+" print ....");
// 为了演示产生的问题,这里设置一次睡眠
Thread.sleep(200);
}
} catch (InterruptedException e) {
}
// 输出结果
System.out.println(ThreadName+" go off.....\n");
}
} else if (ThreadName.equals("Thread-1")) {
//即使竞争线程进入了上述if 分支,并且进入到了syschronize块里
//另外的线程也可以可以执行如下syschronize之前的内容
//所以锁对象是一个概念,是一种机制,而不是字面上理解的锁住整个对象
try {
for(int j =0;j<10;j++){
System.out.println(ThreadName+" enter synchronized before....."+j);
Thread.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
System.out.println(ThreadName+" enter.....");
try {
for(int i = 0;i<10;i++){
System.out.println(ThreadName+" print......");
Thread.sleep(200);
}
} catch (InterruptedException e) {
}
System.out.println(ThreadName+" go off.....\n");
}
}
}
}
public class ThreadSync1 {
public static void main(String args[]) {
ThreadDemo1 th1 = new ThreadDemo1();
new Thread(th1).start();
new Thread(th1).start();
}
}
运行结果:
Thread-0 enter synchronized before.....
Thread-1 enter synchronized before.....0
Thread-0 enter.....
Thread-0 print ....
Thread-0 print ....
Thread-1 enter synchronized before.....1
Thread-0 print ....
Thread-1 enter synchronized before.....2
Thread-0 print ....
Thread-1 enter synchronized before.....3
Thread-0 print ....
Thread-1 enter synchronized before.....4
Thread-0 print ....
Thread-1 enter synchronized before.....5
Thread-0 print ....
Thread-1 enter synchronized before.....6
Thread-0 print ....
Thread-1 enter synchronized before.....7
Thread-0 print ....
Thread-1 enter synchronized before.....8
Thread-0 print ....
Thread-1 enter synchronized before.....9
Thread-0 go off.....
Thread-1 enter.....
Thread-1 print......
Thread-1 print......
Thread-1 print......
Thread-1 print......
Thread-1 print......
Thread-1 print......
Thread-1 print......
Thread-1 print......
Thread-1 print......
Thread-1 print......
Thread-1 go off.....