1、Synchronzied关键字的作用就是:线程同步。它可以用来修改对象中的方法,将对象加锁。意思是不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者F等),如果有的话,需要等正在使用这个方法的线程B(或者F)运行完这个方法后再运行此线程A,没有的话,直接运行。
2、先来看下面这个例子,没有加入synchronized(this) 的情况下的运行结果。
新建一个synchronized_test.java文件,代码如下:
public class synchronized_test implements Runnable { public void run() { //synchronized(this) { int i = 0; for (i = 0; i < 6; i++) { System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); try { Thread.sleep(5); } catch (InterruptedException ie) { } } } } public static void main(String[] args) { synchronized_test C1 = new synchronized_test(); Thread Tc = new Thread(C1, "thread No1"); Thread Td = new Thread(C1, "thread No2"); Tc.start(); Td.start(); } }运行的结果如下:
从打印的结果看了,当一个线程Tc访问object的一个synchronized(this)同步代码块时,另一个线程Td仍然可以访问该object中的非synchronized(this)同步代码块,所以打印出来的结果显然不是我们想要的按顺序的结果。
3、把上面代码里面的synchronized(this) 这一行打开,我们再来看一下运行结果。
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。所以打印出来的结果是有序的。