参考:http://blog.csdn.net/yangzhijun_cau/article/details/6432216
之前在对多线程的学习中,知道了如何利用在方法签名中加上synchronized或在run()中添加synchronized块来实现同步,保证线程能够按自己的安排有条不紊地进行。
但是之前并不知道synchronized具体是如何实现同步的,在网上查看了许多资料后,知道了synchronized锁住的其实是对象,我们用一个例子来说明一下:
package junitTest;
public class DuixiangLock extends Thread {
@Override
public synchronized void run() {
System.out.println("开始");
System.out.println("结束");
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new DuixiangLock().start();
}
}
}
上面代码可以知道五个线程并发执行,synchronized失去效用,说明synchronized只能阻止相同对象的线程。
要防止这种情况发生,可以换另一种写法:
package junitTest;
public class DuixiangLock extends Thread {
@Override
public void run() {
synchronized (DuixiangLock.class) {
System.out.println("开始");
System.out.println("结束");
}
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new DuixiangLock().start();
}
}
}
代码换成了synchronized块,其中参数为要运行线程的类型,这样五个线程就可以按照顺序运行了。