首先明确同步的概念,同步可以让线程之间进行互斥访问,并且可以让线程间进行可靠的通讯。
Synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。很多人会理解为同步的概念是一个互斥的方式,但是这个不是同步的全部意义。同步不仅可以阻止线程看到对象处于不一致的状态中,还可以保证进入同步方法或者同步代码块的每一个线程,都看到由同一个锁保护的之前所有的修改效果。
在这里重点理解下可以让线程进行可靠的通讯,还是用一个列子来说明。现在有三个线程,A输出1,B输出2,C输出3.那么多线程的情况下,按照多线程的原理,输出的是随机的,我们无法知道输出的下一个是什么1,2,3?那么,我们现在要编写一个程序,让3个线程按照顺序不断输出 1 2 3 1 2 3…….这就要求三个线程进程可靠的通讯。
public int code;
public ThreadTest(int code){
this.code = code;
}
private static int TYPE = 1;
private static synchronized void changeType(){
if(TYPE==3){
TYPE=1;
}else{
TYPE = TYPE+1;
}
}
private static synchronized int getType(){
return TYPE;
}
public static void main(String[] args) {
ThreadTest t1 = new ThreadTest(1);
ThreadTest t2 = new ThreadTest(2);
ThreadTest t3 = new ThreadTest(3);
t1.start();
t2.start();
t3.start();
}
@Override
public void run() {
while(true){
if(this.code==getType()){
System.out.println(this.code);
changeType();
}
}
}
写方法和读方法都需要被同步,只同步写方法还不够。读和写方法都被同步了,同步才会起作用。