關(guān)鍵字synchronized可以使多個線程訪問同一資源具有同步性,而且它還具有將線程工作內(nèi)存中的私有變量與公共內(nèi)存中的變量同步的功能。
/**
* @author wuyoushan
* @date 2017/4/10.
*/
public class Service {
private boolean isContinueRun=true;
public void runMethod(){
while (isContinueRun==true){
}
System.out.println("停下來了!");
}
public void stopMethod(){
isContinueRun=false;
}
}
/**
* @author wuyoushan
* @date 2017/4/4.
*/
public class ThreadA extends Thread{
private Service service;
public ThreadA(Service service) {
super();
this.service = service;
}
@Override
public void run() {
service.runMethod();
}
}
/**
* @author wuyoushan
* @date 2017/4/4.
*/
public class ThreadB extends Thread{
private Service service;
public ThreadB(Service service) {
super();
this.service = service;
}
@Override
public void run() {
service.stopMethod();
}
}
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
public static void main(String[] args){
try{
Service service=new Service();
ThreadA a=new ThreadA(service);
a.start();
Thread.sleep(1000);
ThreadB b=new ThreadB(service);
b.start();
System.out.println("已經(jīng)發(fā)起停止的命令了!");
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
以-server服務(wù)器模式運行此項目,出現(xiàn)死循環(huán)。程序的運行結(jié)果為:
已經(jīng)發(fā)起停止的命令了!
出現(xiàn)了死循環(huán)。得到這個結(jié)果是各線程間的數(shù)據(jù)值沒有可視化造成的,而關(guān)鍵字synchronized可以具有可視化。
更改Service.java代碼如下:
/**
* @author wuyoushan
* @date 2017/4/10.
*/
public class Service {
private boolean isContinueRun=true;
public void runMethod(){
String anyString=new String();
while (isContinueRun==true){
synchronized (anyString){
}
}
System.out.println("停下來了!");
}
public void stopMethod(){
isContinueRun=false;
}
}
再以-server服務(wù)器模式運行程序后可以正常退出。運行結(jié)果如下:
已經(jīng)發(fā)起停止的命令了!
停下來了!
關(guān)鍵字synchronized可以保證在同一時刻,只有一個線程可以執(zhí)行某個方法或某一個代碼塊。它包含兩個特征:互斥性和可見性。同步synchronized不僅可以解決一個線程看到對象處于不一致的狀態(tài),還可以保證進入同步方法或者同步代碼塊的每個線程,都看到由同一個鎖保護之前所有的修改效果。
學(xué)習(xí)多線程并發(fā),要著重“外練互斥,內(nèi)修可見”,這是掌握多線程、學(xué)習(xí)多線程并發(fā)的重要技術(shù)點。
摘選自 java多線程核心編程技術(shù)-2.3.7