// 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
// 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
public class Threads implements Runnable {
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
}
}
}
public static void main(String[] args) {
Threads t1 = new Threads();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start();
}
}
// 如果没有synchronized的话
// A synchronized loop 0
// B synchronized loop 0
// B synchronized loop 1
// B synchronized loop 2
// A synchronized loop 1
// B synchronized loop 3
// B synchronized loop 4
// A synchronized loop 2
// A synchronized loop 3
// A synchronized loop 4
// 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
public class LocalThreads {
public void fun1() {
synchronized (this) {
int i = 5;
while (i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
public void fun2() {
int i = 5;
while (i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
public static void main(String[] args) {
final LocalThreads localThreads = new LocalThreads();
new Thread(new Runnable() {
@Override
public void run() {
localThreads.fun1();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
localThreads.fun2();
}
}, "dao").start();
}
}
// Thread-0 : 4
// dao : 4
// dao : 3
// Thread-0 : 3
// Thread-0 : 2
// dao : 2
// Thread-0 : 1
// dao : 1
// Thread-0 : 0
// dao : 0
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
// 修改fun2方法:
public void fun2() {
synchronized (this) {
int i = 5;
while (i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
// Thread-0 : 4
// Thread-0 : 3
// Thread-0 : 2
// Thread-0 : 1
// Thread-0 : 0
// dao : 4
// dao : 3
// dao : 2
// dao : 1
// dao : 0