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

通過實例解析synchronized和lock區(qū)別

 更新時間:2020年12月09日 08:27:49   作者:北方有魚  
這篇文章主要介紹了通過實例解析synchronized和lock區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1,原始構成

synchronized是關鍵字,屬于JVM層面,通過wait,notify和notifyAll來調度線程。

Lock是具體類,是api層面的鎖。

2,使用方法

synchronized不需要用戶手動去釋放鎖, 當synchronized代碼執(zhí)行完后,系統(tǒng)會自動釋放鎖。

Lock需要用戶手動釋放鎖,否則會出現(xiàn)死鎖現(xiàn)象。需要lock和unlock配合try/finally語句塊來完成。

3,等待是否中斷

synchronized不可中斷,除非拋出異?;蛘哒_\行完畢。

Lock可中斷,可以設置超時方法或者調用中斷方法。

4,加鎖是否公平

synchronized非公平鎖。

Lock默認非公平鎖,可指定為公平鎖。

5,鎖綁定多個條件condition

synchronized沒有。

Lock用來分組喚醒需要喚醒的線程,可以精確喚醒,而不是像synchronized一樣要么隨機喚醒一個線程,要么全部喚醒。

Demo: 練習

  多線程之間按順序調用,實現(xiàn)A->B->C三個線程啟動,要求:AA打印5次,BB打印10次,CC打印15次,重復10遍。

package com.demo.lock;

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

class ShareResource{
  int number = 1;
  private Lock lock = new ReentrantLock();
  
  private Condition c1 = lock.newCondition();
  private Condition c2 = lock.newCondition();
  private Condition c3 = lock.newCondition();
  
  public void print5(){
    lock.lock();
    try {
      while(number!=1){
        c1.await();
      }
      for(int i=1;i<=5;i++){
        System.out.println(Thread.currentThread().getName()+"\t"+i);
      }
      number = 2;
      c2.signal();
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      lock.unlock();
    }
  }
  
  public void print10(){
    lock.lock();
    try {
      while(number!=2){
        c2.await();
      }
      for(int i=1;i<=10;i++){
        System.out.println(Thread.currentThread().getName()+"\t"+i);
      }
      number = 3;
      c3.signal();
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      lock.unlock();
    }
  }
  
  public void print15(){
    lock.lock();
    try {
      while(number!=3){
        c3.await();
      }
      for(int i=1;i<=15;i++){
        System.out.println(Thread.currentThread().getName()+"\t"+i);
      }
      number = 1;
      c1.signal();
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      lock.unlock();
    }
  }
}
public class TestReentrantLock {

  public static void main(String[] args) {
    ShareResource shareResource = new ShareResource();
    
    new Thread(()->{
      for(int i=1;i<=10;i++){
        shareResource.print5();
      }
    },"AA").start();
    
    new Thread(()->{
      for(int i=1;i<=10;i++){
        shareResource.print10();
      }
    },"BB").start();
    
    new Thread(()->{
      for(int i=1;i<=10;i++){
        shareResource.print15();
      }
    },"CC").start();
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Springboot靜態(tài)資源的訪問方法介紹

    Springboot靜態(tài)資源的訪問方法介紹

    最近在做SpringBoot項目的時候遇到了“白頁”問題,通過查資料對SpringBoot訪問靜態(tài)資源做了總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 詳解Spring Aop實例之xml配置

    詳解Spring Aop實例之xml配置

    本篇文章主要介紹了詳解Spring Aop實例之xml配置,使用xml可以對aop進行集中配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 圖解Java?ReentrantLock的條件變量Condition機制

    圖解Java?ReentrantLock的條件變量Condition機制

    想必大家都使用過wait()和notify()這兩個方法把,他們主要用于多線程間的協(xié)同處理。而RenentrantLock也支持這樣條件變量的能力,而且相對于synchronized?更加強大,能夠支持多個條件變量,本文就來詳細說說
    2022-10-10
  • Java實現(xiàn)數(shù)據(jù)庫連接的最詳細教程分享

    Java實現(xiàn)數(shù)據(jù)庫連接的最詳細教程分享

    JDBC,Java?Database?Connectivity,即Java數(shù)據(jù)庫連接,是?Java?中的一套和數(shù)據(jù)庫進行交互的API,本文就來講講Java如何利用JDBC實現(xiàn)數(shù)據(jù)庫的連接吧
    2023-05-05
  • java環(huán)境變量為什么要配置path和classpath詳細解答

    java環(huán)境變量為什么要配置path和classpath詳細解答

    為何配置path?為何配置classpath?當時初學java時只是關心如何做而不去關心這些問題,接下來介紹一下,感興趣的朋友可以參考下哦
    2013-01-01
  • 優(yōu)化MyBatis配置文件中的配置詳解

    優(yōu)化MyBatis配置文件中的配置詳解

    這篇文章主要介紹了優(yōu)化MyBatis配置文件中的配置詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • MAVEN的安裝配置與IDEA整合超詳細教程

    MAVEN的安裝配置與IDEA整合超詳細教程

    這篇文章給大家介紹了MAVEN的安裝,配置與IDEA整合方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,感興趣的朋友跟隨小編一起看看吧
    2021-02-02
  • Java中的幾種關鍵字的使用小結

    Java中的幾種關鍵字的使用小結

    本文主要介紹了Java中的幾種關鍵字的使用小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 解讀@ConfigurationProperties的基本用法

    解讀@ConfigurationProperties的基本用法

    這篇文章主要介紹了@ConfigurationProperties的基本用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • RabbitMQ,RocketMQ,Kafka?事務性,消息丟失,消息順序性和消息重復發(fā)送的處理策略問題

    RabbitMQ,RocketMQ,Kafka?事務性,消息丟失,消息順序性和消息重復發(fā)送的處理策略問題

    這篇文章主要介紹了RabbitMQ,RocketMQ,Kafka?事務性,消息丟失,消息順序性和消息重復發(fā)送的處理策略,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論

商河县| 上高县| 陵水| 邛崃市| 大埔区| 长治市| 司法| 巴楚县| 周口市| 同心县| 日照市| 泗阳县| 绵竹市| 武夷山市| 泗水县| 赣榆县| 道孚县| 齐齐哈尔市| 龙南县| 江永县| 昌宁县| 甘孜县| 榆林市| 布尔津县| 长海县| 石城县| 治县。| 白银市| 和政县| 新平| 麻阳| 区。| 遂川县| 灯塔市| 民勤县| 武城县| 昔阳县| 谢通门县| 屏东县| 桃江县| 新源县|