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

Java實(shí)現(xiàn)線程同步方法及原理詳解

 更新時(shí)間:2020年06月03日 09:10:58   作者:main(0)  
這篇文章主要介紹了Java實(shí)現(xiàn)線程同步方法及原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、概述

無(wú)論是什么語(yǔ)言,在多線程編程中,常常會(huì)遇到多個(gè)線同時(shí)操作程某個(gè)變量(讀/寫(xiě)),如果讀/寫(xiě)不同步,則會(huì)造成不符合預(yù)期的結(jié)果。

例如:線程A和線程B并發(fā)運(yùn)行,都操作變量X,若線程A對(duì)變量X進(jìn)行賦上一個(gè)新值,線程B仍然使用變量X之前的值,很明顯線程B使用的X不是我們想要的值了。

Java提供了三種機(jī)制,解決上述問(wèn)題,實(shí)現(xiàn)線程同步:

同步代碼塊

synchronized(鎖對(duì)象){
	// 這里添加受保護(hù)的數(shù)據(jù)操作
}

同步方法

靜態(tài)同步方法:synchronized修飾的靜態(tài)方法,它的同步鎖是當(dāng)前方法所在類的字節(jié)碼對(duì)象

public static synchronized void staticMethod(){
}

非靜態(tài)同步方法:synchronized修飾的非靜態(tài)方法,它的同步鎖即為this

public synchronize void method(){
}

鎖機(jī)制

// 以可重入鎖舉例
Lock lock = new ReentrantLock(/*fail*/);
// fail:
// true表示使用公平鎖,即線程等待拿到鎖的時(shí)間越久,越容易拿到鎖
// false表示使用非公平鎖,線程拿到鎖全靠運(yùn)氣。。。cpu時(shí)間片輪到哪個(gè)線程,哪個(gè)線程就能獲取鎖
lock.lock();
// 這里添加受保護(hù)的數(shù)據(jù)操作
lock.unlock();

個(gè)人理解:其實(shí)無(wú)論哪種機(jī)制實(shí)現(xiàn)線程同步,本質(zhì)上都是加鎖->操作數(shù)據(jù)->解鎖的過(guò)程。同步代碼塊是針對(duì){}中,同步方法是針對(duì)整個(gè)方法。其ReentrantLock類提供的lock和unlock和C++的std::mutex提供lock和unlock類似

二、測(cè)試用例

同步代碼塊測(cè)試類

package base.synchronize;


public class SynchronizeBlock implements Runnable {
  private int num = 100;

  @Override
  public void run() {
    while (num > 1) {
      synchronized (this) {
        // 同步代碼塊,只有拿到鎖,才有cpu執(zhí)行權(quán)
        System.out.println("Thread ID:" + Thread.currentThread().getId() + "---num:" + num);
        num--;
      }
    }
    System.out.println("Thread ID:" + Thread.currentThread().getId() + " exit");
  }
}

同步方法測(cè)試類

package base.synchronize;

public class SynchronizeMethod implements Runnable {
  private int num = 100;
  public static int staticNum = 100;
  boolean useStaticMethod;

  public SynchronizeMethod(boolean useStaticMethodToTest) {
    this.useStaticMethod = useStaticMethodToTest;
  }

  // 對(duì)于非靜態(tài)方法,同步鎖對(duì)象即this
  public synchronized void method() {
    System.out.println("Thread ID:" + Thread.currentThread().getId() + "---num:" + num);
    num--;
  }

  // 對(duì)于靜態(tài)方法,同步鎖對(duì)象是當(dāng)前方法所在類的字節(jié)碼對(duì)象
  public synchronized static void staticMethod() {
    System.out.println("Static Method Thread ID:" + Thread.currentThread().getId() + "---num:" + staticNum);
    staticNum--;
  }

  @Override
  public void run() {
    if (useStaticMethod) { // 測(cè)試靜態(tài)同步方法
      while (staticNum > 1) {
        staticMethod();
      }
    }else{ // 測(cè)試非靜態(tài)同步方法
      while (num > 1){
        method();
      }
    }
    System.out.println("Thread ID:" + Thread.currentThread().getId() + " exit");
  }
}

ReentrantLock測(cè)試類

package base.synchronize;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SynchronizeLock implements Runnable {
  private Lock lock = null;
  private int num = 100;

  public SynchronizeLock(boolean fair){
    lock = new ReentrantLock(fair); // 可重入鎖
  }

  @Override
  public void run() {
    while (num > 1) {
      try {
        lock.lock();
        System.out.println("Thread ID:" + Thread.currentThread().getId() + "---num:" + num);
        num--;
      } catch (Exception e) {
        e.printStackTrace();
      }finally {
        lock.unlock();
      }
    }
    System.out.println("Thread ID:" + Thread.currentThread().getId() + " exit");
  }
}

測(cè)試三種機(jī)制的Demo

package base.synchronize;

public class Demo {
  public static void main(String[] args) {
    synchronizeBlockTest();   // 同步代碼塊
    synchronizeMethodTest();  // 同步非靜態(tài)方法
    synchronizeStaticMethodTest(); // 同步靜態(tài)方法
    synchronizeLockTest();  // 可重入鎖機(jī)制
  }

  public static void synchronizeBlockTest(){
    Runnable run = new SynchronizeBlock();
    for(int i = 0; i < 3; i++){
      new Thread(run).start();
    }
  }

  public static void synchronizeMethodTest(){
    Runnable run = new SynchronizeMethod(false);
    for(int i = 0; i < 3; i++){
      new Thread(run).start();
    }

  }
  public static void synchronizeStaticMethodTest() {
    Runnable run = new SynchronizeMethod(true);
    for(int i = 0; i < 3; i++){
      new Thread(run).start();
    }
  }


  public static void synchronizeLockTest(){
    Runnable run = new SynchronizeLock(false); // true:使用公平鎖 false:使用非公平鎖
    for(int i = 0; i < 3; i++){
      new Thread(run).start();
    }
  }
}

無(wú)論哪種機(jī)制,都得到預(yù)期的效果,打印100-0

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA 2020.1.1好用的plugins插件推薦

    IDEA 2020.1.1好用的plugins插件推薦

    這篇文章主要介紹了IDEA 2020.1.1好用的plugins插件推薦,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java中實(shí)現(xiàn)自定義注解方式

    java中實(shí)現(xiàn)自定義注解方式

    注解是Java中的一種元數(shù)據(jù),可以修飾方法、類、參數(shù)和包等,自定義注解需要public修飾符、@interface關(guān)鍵字,以及注解名稱和類型元素,元注解如@Target、@Retention等用于修飾注解,指定注解的適用范圍和生命周期,自定義注解的使用涉及到通過(guò)反射解析注解
    2024-11-11
  • Java手寫(xiě)簡(jiǎn)易版HashMap的使用(存儲(chǔ)+查找)

    Java手寫(xiě)簡(jiǎn)易版HashMap的使用(存儲(chǔ)+查找)

    這篇文章主要介紹了Java手寫(xiě)簡(jiǎn)易版HashMap的使用(存儲(chǔ)+查找),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • ElasticSearch的安裝與基本概念

    ElasticSearch的安裝與基本概念

    這篇文章主要介紹了ElasticSearch的安裝與基本概念,提供了一個(gè)分布式多用戶能力的全文搜索引擎,Elasticsearch是用Java開(kāi)發(fā)的,需要的朋友可以參考下
    2023-04-04
  • 淺談Java中Spring Boot的優(yōu)勢(shì)

    淺談Java中Spring Boot的優(yōu)勢(shì)

    在本篇文章中小編給大家分析了Java中Spring Boot的優(yōu)勢(shì)以及相關(guān)知識(shí)點(diǎn)內(nèi)容,興趣的朋友們可以學(xué)習(xí)參考下。
    2018-09-09
  • Java數(shù)字和字符串拼接原理及案例

    Java數(shù)字和字符串拼接原理及案例

    這篇文章主要介紹了Java數(shù)字和字符串拼接原理及案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java線程池中線程數(shù)量到底是幾

    java線程池中線程數(shù)量到底是幾

    本文主要介紹了java線程池中線程數(shù)量到底是幾,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • springboot 獲取訪問(wèn)接口的請(qǐng)求的IP地址的實(shí)現(xiàn)

    springboot 獲取訪問(wèn)接口的請(qǐng)求的IP地址的實(shí)現(xiàn)

    本文主要介紹了springboot獲取訪問(wèn)接口的請(qǐng)求的IP地址的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot+WebMagic+MyBaties實(shí)現(xiàn)爬蟲(chóng)和數(shù)據(jù)入庫(kù)的示例

    SpringBoot+WebMagic+MyBaties實(shí)現(xiàn)爬蟲(chóng)和數(shù)據(jù)入庫(kù)的示例

    WebMagic是一個(gè)開(kāi)源爬蟲(chóng)框架,本項(xiàng)目通過(guò)在SpringBoot項(xiàng)目中使用WebMagic去抓取數(shù)據(jù),最后使用MyBatis將數(shù)據(jù)入庫(kù)。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Mybatis-Plus實(shí)現(xiàn)只更新部分字段的數(shù)據(jù)

    Mybatis-Plus實(shí)現(xiàn)只更新部分字段的數(shù)據(jù)

    這篇文章主要介紹了Mybatis-Plus實(shí)現(xiàn)只更新部分字段的數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論

黔西县| 吉水县| 台北县| 盐池县| 赤壁市| 榆中县| 太保市| 万荣县| 黄大仙区| 通城县| 宜丰县| 沛县| 凤阳县| 泰宁县| 黑龙江省| 上饶市| 宁波市| 白城市| 海晏县| 聂荣县| 红河县| 重庆市| 四平市| 酒泉市| 盐边县| 虹口区| 斗六市| 江西省| 天祝| 福泉市| 南康市| 大荔县| 栖霞市| 庐江县| 洛隆县| 吉安市| 得荣县| 浮山县| 乐平市| 玉林市| 错那县|