2.3.7synchronized代碼塊有volatile同步的功能

關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 引用自多線程編程指南應(yīng)用程序里面多個線程的存在引發(fā)了多個執(zhí)行線程安全訪問資源的潛在問題。兩個線程同時修改同一資源有...
    Mitchell閱讀 2,118評論 1 7
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,298評論 0 14
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,810評論 11 349
  • 聲震公交四座驚,小屏大字看分明; 久聊電量無稍慮,常敘耳邊兒女情。
    銓齋閱讀 2,221評論 9 21

友情鏈接更多精彩內(nèi)容