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)同步代码块的访问将被阻塞。所以打印出来的结果是有序的。