作用:当两个或多个线程需要共享,update操作时,需要通过某种方法来确定该资源在任意时刻仅被一个线程占用,实现上述目的的过程就叫同步
同步分为同步方法和同步语句
注意:synchronized声明不会被集成,如果一个用synchronized修饰的方法被子类覆盖,那么子类中这个方法不再具有同步功能,除非再用synchronized修饰,简单的其实也可以用static修饰就行了
下面这情况两个线程同时对info1和info2设置值,可能出现info1和info2不相等的情况,如下,我们可以利用同步方法和同步语句对info1和info2对象加锁
public class Info {
String info1 ="";
String info2="";
int count ;
public void compareInfo(String info) {
info1=info;
info2=info;
if((info1.compareTo(info2)) != 0)
System.out.println("出现了info1 <> info2");
count ++;
}
}
package thread;
public class InfoTest {
public static void main(String[] args) {
final Info info =new Info();
Thread th1 =new Thread(new Runnable(){
public void run(){
while(true)
info.compareInfo("infoOne");
}
});
Thread th2 =new Thread(new Runnable(){
public void run(){
while(true)
info.compareInfo("infoTWO");
}
});
th1.start();
th2.start();
}
}
(一):同步方法
public class Info {
String info1 ="";
String info2="";
int count ;
public synchronized void compareInfo(String info) {
info1=info;
info2=info;
if((info1.compareTo(info2)) != 0)
System.out.println("出现了info1 <> info2");
count ++;
}
}
同步语句:
package thread;
public class InfoTest {
public static void main(String[] args) {
final Info info =new Info();
Thread th1 =new Thread(new Runnable(){
public void run(){
while(true)
synchronized(info){
info.compareInfo("infoOne");
}
}
});
Thread th2 =new Thread(new Runnable(){
public void run(){
while(true)
synchronized(info){
info.compareInfo("infoTWO");
}
}
});
th1.start();
th2.start();
}
}