最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳談Java多線程的幾個(gè)常用關(guān)鍵字

 更新時(shí)間:2017年04月27日 09:03:23   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇詳談Java多線程的幾個(gè)常用關(guān)鍵字。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

一、同步(synchronized)和異步(asynchronized)

1、同步(synchronized)簡(jiǎn)單說(shuō)可以理解為共享的意思,如果資源不是共享的,就沒(méi)必要進(jìn)行同步。設(shè)置共享資源為同步的話,可以避免一些臟讀情況。

2、異步(asynchronized)簡(jiǎn)單說(shuō)可以理解為獨(dú)立不受到其他任何制約。

舉個(gè)例子:

線程1調(diào)用了帶有synchronized關(guān)鍵字的方法methodA,線程2調(diào)用了異步方法methodB,出現(xiàn)的現(xiàn)象是同時(shí)控制臺(tái)輸出 t1,t2。

package com.ietree.multithread.sync;

/**
 * 多線程之對(duì)象同步鎖和異步鎖Demo
 *
 * @author ietree
 */
public class SynAndAsynDemo {

  public static void main(String[] args) {
    
    final SynAndAsynDemo mo = new SynAndAsynDemo();
    
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        mo.methodA();
      }
    },"t1");
    
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        mo.methodB();
      }
    },"t2");
    
    t1.start();
    t2.start();
  }
  
  // 方法A
  public synchronized void methodA(){
    try {
      System.out.println(Thread.currentThread().getName());
      // 休眠4秒
      Thread.sleep(4000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  
  // 方法B
  public void methodB(){
    System.out.println(Thread.currentThread().getName());
  }
  
}

線程1調(diào)用了帶有synchronized關(guān)鍵字的方法methodA,線程2調(diào)用了帶有synchronized關(guān)鍵字的方法methodB,出現(xiàn)的現(xiàn)象是首先輸出t1,等待4秒之后再輸出t2。

package com.ietree.multithread.sync;

/**
 * 多線程之對(duì)象同步鎖和異步鎖Demo
 *
 * @author ietree
 */
public class SynAndAsynDemo {

  public static void main(String[] args) {
    
    final SynAndAsynDemo mo = new SynAndAsynDemo();
    
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        mo.methodA();
      }
    },"t1");
    
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        mo.methodB();
      }
    },"t2");
    
    t1.start();
    t2.start();
  }
  
  // 方法A
  public synchronized void methodA(){
    try {
      System.out.println(Thread.currentThread().getName());
      // 休眠4秒
      Thread.sleep(4000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  
  // 方法B
  public synchronized void methodB(){
    System.out.println(Thread.currentThread().getName());
  }
  
}

結(jié)論:

在第一段代碼中t1線程先持有object對(duì)象的Lock鎖,t2線程可以以異步的方式調(diào)用對(duì)象中的非synchronized修飾的方法,所以同時(shí)輸出;

在第二段代碼中t1線程先持有object對(duì)象的Lock鎖,t2線程如果在這個(gè)時(shí)候調(diào)用對(duì)象中的同步(synchronized)方法則需等待,也就是同步。

二、volatile

作用:volatile關(guān)鍵字的作用是:使變量在多個(gè)線程間可見(jiàn)(具有可見(jiàn)性),但是僅靠volatile是不能保證線程的安全性,volatile關(guān)鍵字不具備synchronized關(guān)鍵字的原子性。

Demo1:

package com.ietree.multithread.sync;

public class RunThread extends Thread {
  // volatile
  private boolean isRunning = true;

  private void setRunning(boolean isRunning) {
    this.isRunning = isRunning;
  }

  public void run() {
    System.out.println("進(jìn)入run方法..");
    int i = 0;
    while (isRunning == true) {
      // ..
    }
    System.out.println("線程停止");
  }

  public static void main(String[] args) throws InterruptedException {
    RunThread rt = new RunThread();
    rt.start();
    Thread.sleep(1000);
    rt.setRunning(false);
    System.out.println("isRunning的值已經(jīng)被設(shè)置了false");
  }
}

程序輸出:

進(jìn)入run方法..
isRunning的值已經(jīng)被設(shè)置了false

之后進(jìn)入死循環(huán)

Demo2:

package com.ietree.multithread.sync;

public class RunThread extends Thread {
  // volatile
  private volatile boolean isRunning = true;

  private void setRunning(boolean isRunning) {
    this.isRunning = isRunning;
  }

  public void run() {
    System.out.println("進(jìn)入run方法..");
    int i = 0;
    while (isRunning == true) {
      // ..
    }
    System.out.println("線程停止");
  }

  public static void main(String[] args) throws InterruptedException {
    RunThread rt = new RunThread();
    rt.start();
    Thread.sleep(1000);
    rt.setRunning(false);
    System.out.println("isRunning的值已經(jīng)被設(shè)置了false");
  }
}

程序輸出:

isRunning的值已經(jīng)被設(shè)置了false
線程停止

總結(jié):當(dāng)多個(gè)線程之間需要根據(jù)某個(gè)條件確定 哪個(gè)線程可以執(zhí)行時(shí),要確保這個(gè)條件在 線程之間是可見(jiàn)的。因此,可以用volatile修飾。

volatile 與 synchronized 的比較:

①volatile輕量級(jí),只能修飾變量。synchronized重量級(jí),還可修飾方法

②volatile只能保證數(shù)據(jù)的可見(jiàn)性,不能用來(lái)同步,因?yàn)槎鄠€(gè)線程并發(fā)訪問(wèn)volatile修飾的變量不會(huì)阻塞。

synchronized不僅保證可見(jiàn)性,而且還保證原子性,因?yàn)椋挥蝎@得了鎖的線程才能進(jìn)入臨界區(qū),從而保證臨界區(qū)中的所有語(yǔ)句都全部執(zhí)行。多個(gè)線程爭(zhēng)搶synchronized鎖對(duì)象時(shí),會(huì)出現(xiàn)阻塞。

線程安全性包括兩個(gè)方面,①可見(jiàn)性。②原子性。

從上面自增的例子中可以看出:僅僅使用volatile并不能保證線程安全性。而synchronized則可實(shí)現(xiàn)線程的安全性。

以上這篇詳談Java多線程的幾個(gè)常用關(guān)鍵字就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java Spring MVC4環(huán)境搭建實(shí)例詳解(步驟)

    java Spring MVC4環(huán)境搭建實(shí)例詳解(步驟)

    spring WEB MVC框架提供了一個(gè)MVC(model-view-controller)模型-視圖-控制器的結(jié)構(gòu)和組件,利用它可以開(kāi)發(fā)更靈活、松耦合的web應(yīng)用。MVC模式使得整個(gè)服務(wù)應(yīng)用的各部分(控制邏輯、業(yè)務(wù)邏輯、UI界面展示)分離開(kāi)來(lái),使它們之間的耦合性更低
    2017-08-08
  • 阿里云發(fā)布 Spring Boot 新腳手架工程

    阿里云發(fā)布 Spring Boot 新腳手架工程

    這篇文章主要介紹了阿里云發(fā)布 Spring Boot 新腳手架的相關(guān)資料,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,可以參考下
    2020-04-04
  • SpringMVC?@RequestMapping注解屬性詳細(xì)介紹

    SpringMVC?@RequestMapping注解屬性詳細(xì)介紹

    通過(guò)@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • SpringBoot3.x中spring.factories?SPI?服務(wù)發(fā)現(xiàn)機(jī)制的改變問(wèn)題小結(jié)

    SpringBoot3.x中spring.factories?SPI?服務(wù)發(fā)現(xiàn)機(jī)制的改變問(wèn)題小結(jié)

    spring.factories其實(shí)是SpringBoot提供的SPI機(jī)制,底層實(shí)現(xiàn)是基于SpringFactoriesLoader檢索ClassLoader中所有jar引入的META-INF/spring.factories文件,這篇文章主要介紹了SpringBoot3.x中spring.factories?SPI?服務(wù)發(fā)現(xiàn)機(jī)制的改變,需要的朋友可以參考下
    2023-05-05
  • java volatile關(guān)鍵字作用及使用場(chǎng)景詳解

    java volatile關(guān)鍵字作用及使用場(chǎng)景詳解

    在本文里我們給大家分享的是關(guān)于java volatile關(guān)鍵字作用及使用場(chǎng)景的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-08-08
  • SpringBoot使用mybatis步驟總結(jié)

    SpringBoot使用mybatis步驟總結(jié)

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot使用mybatis步驟展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 修改jvm-sandbox源碼導(dǎo)致線程安全分析

    修改jvm-sandbox源碼導(dǎo)致線程安全分析

    這篇文章主要為大家介紹了修改jvm-sandbox源碼導(dǎo)致線程安全分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Struts2中ognl遍歷數(shù)組,list和map方法詳解

    Struts2中ognl遍歷數(shù)組,list和map方法詳解

    這篇文章主要介紹了Struts2中ognl遍歷數(shù)組,list和map方法詳解,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot使用Prometheus采集自定義指標(biāo)數(shù)據(jù)的方法詳解

    SpringBoot使用Prometheus采集自定義指標(biāo)數(shù)據(jù)的方法詳解

    隨著微服務(wù)在生產(chǎn)環(huán)境大規(guī)模部署和應(yīng)用,隨之而來(lái)也帶來(lái)了新的問(wèn)題,其中比較關(guān)鍵的就是關(guān)于微服務(wù)的運(yùn)維和監(jiān)控,本文將結(jié)合微服務(wù)運(yùn)維監(jiān)控中的指標(biāo)監(jiān)控進(jìn)行詳細(xì)的說(shuō)明,需要的朋友可以參考下
    2024-07-07
  • 大話Java混合運(yùn)算規(guī)則

    大話Java混合運(yùn)算規(guī)則

    這篇文章主要介紹了大話Java混合運(yùn)算規(guī)則,小編覺(jué)得挺不錯(cuò)的,在這里分享給大家,需要的朋友可以了解下。
    2017-10-10

最新評(píng)論

兰州市| 桃江县| 山阳县| 师宗县| 东丰县| 新田县| 兴文县| 个旧市| 达拉特旗| 定结县| 永安市| 廉江市| 长宁县| 陆良县| 宝兴县| 东乡族自治县| 黄龙县| 通化市| 汉沽区| 治多县| 深州市| 麟游县| 阿合奇县| 陈巴尔虎旗| 自治县| 德格县| 柘城县| 奉化市| 白山市| 同仁县| 龙山县| 固阳县| 甘泉县| 新郑市| 漳州市| 阳原县| 城口县| 朝阳市| 碌曲县| 福安市| 米脂县|