<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試之JUC和JVM

          共 12864字,需瀏覽 26分鐘

           ·

          2021-05-07 01:37

          點擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時間送達(dá)

          76套java從入門到精通實戰(zhàn)課程分享

          垃圾回收機制算法

          • 復(fù)制算法:用于年輕代

          • 標(biāo)記清除算法:用于老年代

          • 標(biāo)記整理算法:用戶老年代

          • 分代收集算法:年輕代特點是區(qū)域相對老年代較小,對像存活率低,使用復(fù)制算法,老年代的特   點是區(qū)域較大,對像存活率高。標(biāo)記清除和標(biāo)記整理混合使用。

          個對象怎么判斷是垃圾被回收

          • 引用計數(shù)法:是通過判斷對象的引用數(shù)量來決定對象是否可以被回收,很難處理循     環(huán)引用,相互引用的兩個對象則無法釋放。

          • 可達(dá)性分析:這個算法的基本思想就是通過一系列的稱為 “GC Roots” 的對象作 為起點,從這些節(jié)點開始向下搜索,節(jié)點所走過的路徑稱為引用鏈當(dāng)一個對象到 GC Roots 沒有任何引用鏈相連的話,則證明此對象是不可用的。                                  

          JVM 架構(gòu),回收機制

          方法區(qū):存儲已被虛擬機加載的類元數(shù)據(jù)信息(元空間)

          堆:存放對象實例,幾乎所有的對象實例都在這里分配內(nèi)存

          虛擬機棧:虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法被執(zhí)行的時候都會  同時創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作棧、動態(tài)鏈接、   方法出口等信息

          程序計數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器

          本地方法棧:本地方法棧則是為虛擬機使用到的Native方法服務(wù)。

          volatile 關(guān)鍵字

          Volatile是Java虛擬機提供的輕量級的同步機制(三大特性)

          • 保證可見性(及時通知):變量被volatile修飾之后,當(dāng)該變量被修改之后使用到該變量的地方都會被感知到

          • 不保證原子性:原子性是指不可分割,完整性,也就是說某個線程正在做某個具體業(yè)務(wù)時,中間不可以被加塞或者被分割,需要具體完成,要么同時成功,要么同時失敗。

          • 禁止指令重排:計算機在執(zhí)行程序時,為了提高性能,編譯器和處理器常常會對指令重排。但是處理器在進(jìn)行重排時候,必須考慮到指令之間的數(shù)據(jù)依賴性。

          說一下synchronized和lock的區(qū)別

          1)synchronized屬于JVM層面,屬于java的關(guān)鍵字

          monitorenter(底層是通過monitor對象來完成,其實wait/notify等方法也依賴于monitor對象 只能在同步塊或者方法中才能調(diào)用 wait/ notify等方法)

          Lock是具體類(java.util.concurrent.locks.Lock)是api層面的鎖

          2)使用方法:

          synchronized:不需要用戶去手動釋放鎖,當(dāng)synchronized代碼執(zhí)行后,系統(tǒng)會自動讓線程釋放對鎖的占用

          ReentrantLock:則需要用戶去手動釋放鎖,若沒有主動釋放鎖,就有可能出現(xiàn)死鎖的現(xiàn)象,需要lock() 和 unlock() 配置try catch語句來完成

          3)等待是否中斷

          synchronized:不可中斷,除非拋出異常或者正常運行完成

          ReentrantLock:可中斷,可以設(shè)置超時方法

          設(shè)置超時方法,trylock(long timeout, TimeUnit unit)

          lockInterrupible() 放代碼塊中,調(diào)用interrupt() 方法可以中斷

          4)加鎖是否公平

          synchronized:非公平鎖

          ReentrantLock:默認(rèn)非公平鎖,構(gòu)造函數(shù)可以傳遞boolean值,true為公平鎖,false為非公平鎖

          5)鎖綁定多個條件Condition

          synchronized:沒有,要么隨機,要么全部喚醒

          ReentrantLock:用來實現(xiàn)分組喚醒需要喚醒的線程,可以精確喚醒,而不是像synchronized那樣,要么隨機,要么全部喚醒

          悲觀鎖和樂觀鎖

          樂觀鎖:顧名思義,就是十分樂觀,它總是認(rèn)為不會出現(xiàn)問題,無論干什么都不去 上鎖,如果出現(xiàn)了問題,再次更新值測試,這里使用了version字段。

          也就是每次更新的時候同時維護(hù)一個version字段。

          可以使用CAS(compare and swap)實現(xiàn),CAS是由CPU硬件實現(xiàn),所以執(zhí)行相當(dāng)快.CAS 有三個操作參數(shù):內(nèi)存地址,期望值,要修改的新值,當(dāng)期望值和內(nèi)存當(dāng)中的值進(jìn) 行比較不相等的時候,表示內(nèi)存中的值已經(jīng)被別線程改動過,這時候失敗返回,當(dāng) 相等的時候,將內(nèi)存中的值改為新的值,并返回成功。 

          悲觀鎖:顧名思義,就是十分悲觀,它總是認(rèn)為什么時候都會出現(xiàn)問題,無論什么 操作都會上鎖,再次操作,synchronized就是一個典型的悲觀鎖

          線程池的創(chuàng)建

          Executors工具類和ThreadPoolExecutor方式創(chuàng)建推薦使用ThreadPoolExecutor方式創(chuàng)建,其中有七個參數(shù)

          • corePoolSize:線程池中的常駐核心線程數(shù)

          • maximumPoolSize:線程池中能夠容納同時 執(zhí)行的最大線程數(shù),此值必須大于等于1

          • keepAliveTime:多余的空閑線程的存活時間 當(dāng)前池中線程數(shù)量超過corePoolSize時,當(dāng)空閑時間達(dá)到keepAliveTime時,多余線程會被銷毀直到 只剩下corePoolSize個線程為止

          • unit:keepAliveTime的單位

          • workQueue:任務(wù)隊列,被提交但尚未被執(zhí)行的任務(wù)

          • threadFactory:表示生成線程池中工作線程的線程工廠, 用于創(chuàng)建線程,一般默認(rèn)的即可

          • handler:拒絕策略,表示當(dāng)隊列滿了,并且工作線程大于 等于線程池的最大線程數(shù)(maximumPoolSize)時,如何來拒絕 請求執(zhí)行的runnable的策略

          cpu占用滿了如何排查

          • 先用top命令,找到cpu占用最高的進(jìn)程 PID 

          • 再用ps -mp pid -o THREAD,tid,time   

          • 查詢進(jìn)程中,那個線程的cpu占用   率高記住TID

          • jstack 29099 >> xxx.log   打印出該進(jìn)程下線程日志

          • sz xxx.log 將日志文件下載到本地

          寫一個死鎖

          /**
           * 資源類
           */
          class Lock implements Runnable {
              private String lockA;
              private String lockB;
              public Lock(String lockA, String lockB) {
                  this.lockA = lockA;
                  this.lockB = lockB;
              }
              @Override
              public void run() {
                  synchronized (lockA) {
                      System.out.println(Thread.currentThread().getName() + "用了" + lockA + "想獲取" + lockB);
                      try {
                          Thread.sleep(3000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      synchronized (lockB) {
                          System.out.println(Thread.currentThread().getName() + "用了" + lockB + "想獲取" + lockA);
                      }
                  }
              }
          }
          public class DeadLockDemo01 {
              /**
               * 線程 操作 資源類
               */
              public static void main(String[] args) {
                  String lockA = "lockA";
                  String lockB = "lockB";

                  new Thread(new Lock(lockA, lockB), "T1").start();
                  new Thread(new Lock(lockB, lockA), "T2").start();
              }
          }

          線程數(shù)是怎么設(shè)置的

          使用ThreadPoolExecutor 第一個參數(shù)就是核心線程數(shù)

          說一下創(chuàng)建線程的方式,以及線程的狀態(tài)吧

          傳統(tǒng)的是繼承thread類和實現(xiàn)runnable接口

          java5以后又有實現(xiàn)callable接口和java的線程池獲得

          線程狀態(tài)

          ①創(chuàng)建狀態(tài)

          ②就緒狀態(tài)

          ③運行狀態(tài)

          ④阻塞狀態(tài)

          ⑤死亡狀態(tài)

          線程池的運行原理

          • 在創(chuàng)建了線程池后,線程池中的線程數(shù)為零。

          • 當(dāng)調(diào)用execute()方法添加一個請求任務(wù)時,線程池會做出如下判斷:

          • 如果正在運行的線程數(shù)量小于corePoolSize,那么馬上創(chuàng)建線程運行這個任務(wù);

          • 如果正在運行的線程數(shù)量大于或等于corePoolSize,那么將這個任務(wù)放入隊列;

          • 如果這個時候隊列滿了且正在運行的線程數(shù)量還小于maximumPoolSize,那么還是要創(chuàng)建非核心線程立刻運行這個任務(wù);

          • 如果隊列滿了且正在運行的線程數(shù)量大于或等于maximumPoolSize,那么線程池會啟動飽和拒絕策略來執(zhí)行。

          • 當(dāng)一個線程完成任務(wù)時,它會從隊列中取下一個任務(wù)來執(zhí)行。

          • 當(dāng)一個線程無事可做超過一定的時間(keepAliveTime)時,線程會判斷:

          • 如果當(dāng)前運行的線程數(shù)大于corePoolSize,那么這個線程就被停掉。

          • 所以線程池的所有任務(wù)完成后,它最終會收縮到corePoolSize的大小。

          介紹一下jvm

          • 方法區(qū):存儲已被虛擬機加載的類元數(shù)據(jù)信息(元空間)

          • 堆:存放對象實例,幾乎所有的對象實例都在這里分配內(nèi)存

          • 虛擬機棧:虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法被執(zhí)行的時候都會 同時創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作棧、動態(tài)鏈接、方法 出口等信息

          • 程序計數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器

          • 本地方法棧:本地方法棧則是為虛擬機使用到的Native方法服務(wù)。

          寫一個線程安全的單例模式()

          // 懶漢式單例模式會有線程安全問題

          public void SingleTonDemo{
          // 私有化構(gòu)造器

          private SingleTonDemo(){};

           

          // 私有屬性

          private static Volatile SingleTonDemo std = null;  

           

          // 提供公有方法

          public SingleTonDemo getStd(){
          If(std == null){
          Synchronized(SingleTonDemo.class){
          If(std == null){
          Std = new SingleTonDeno();

          }

          }

          }

          return std;

          }

          }

          談?wù)勀銓uc的理解

          1. 是Java5.0提供的一個java.util.concurrent包,在包中提供了一些并發(fā)編程中很常用的工具類。

          2. 創(chuàng)建線程有四種方式:

          繼承Thread類

          實現(xiàn)Runnable接口

          實現(xiàn)Callable接口 + FutureTask類

          線程池

          allable接口與runnable接口的區(qū)別?

          相同點:

          都是接口,都可以編寫多線程程序,都采用Thread.start()啟動線程

          不同點:

          具體方法不同:一個是run,一個是call

          Runnable沒有返回值;Callable可以返回執(zhí)行結(jié)果,是個泛型

          Callable接口的call()方法允許拋出異常;Runnable的run()方法異常只能在內(nèi)部消化,不能往上繼續(xù)拋它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結(jié)果。

          synchronized和lock鎖的區(qū)別

          Synchronized是java的一個關(guān)鍵字

          Lock 屬于api層面

          Synchronized可以自動解鎖

          Lock需要手動解鎖

          Synchronized中途不可以中斷

          Lock可以中斷

          Synchrozied屬于公平鎖

          Lock既可以是公平鎖又可以是非公平鎖根據(jù)傳入的參數(shù)

          喚醒機制:synchronized只能全部喚醒

                Lock可以根據(jù)條件喚醒不同的線程

          談?wù)勀銓olatile的理解

          Volatile是一個輕量級的同步機制,它有三個屬性:

          1. 保證可見性

          2. 不保證原子性

          3. 禁止指令重排

          說說類加載器類型和JVM內(nèi)存結(jié)構(gòu)

          類加載器:啟動類加載器(Bootstrap)C++、擴展類加載器(Extension)Java、應(yīng)用程序類加載器(AppClassLoader)Java、用戶自定義加載器 Java.lang.ClassLoader的子類,用戶可以定制類的加載方式

          1. 雙親委派模型。簡單來說:如果一個類加載器收到了類加載的請求,它首先不會自 己去嘗試加載這個類, 而是把請求委托給父加載器去完成,依次向上。

          • 棧:虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法被執(zhí)行的時候都會同時創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作棧、動態(tài)鏈接、方法出口等信息

          • 堆:存放對象實例,幾乎所有的對象實例都在這里分配內(nèi)存

          • 方法區(qū):存儲已被虛擬機加載的類元數(shù)據(jù)信息(元空間)

          • 程序計數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器

          • 本地方法棧:本地方法棧則是為虛擬機使用到的Native方法服務(wù)。

          • 執(zhí)行引擎

          • 本地方法接口:執(zhí)行本地方法庫

          thread.sleep()和wait()區(qū)別?還問了wait()鎖的問題?

          1. 所屬類不同:sleep屬于Thread類,wait屬于Object類

          2. 是否釋放鎖:sleep不釋放線程所擁有的監(jiān)視器資源,而wait會把監(jiān)視器資源釋放

          3. 用法不同:wait()方法通常用于線程間的交互和通信,sleep通常用于暫停執(zhí)行

          4. 用途不同:wait()方法被調(diào)用后,如果沒有設(shè)置等待時間,線程不會自動蘇醒,需要別的線程調(diào)用共享變量的notify()或notifyAll()方法。sleep()方法在等待時間到了之后,會自動蘇醒

          sleep()睡眠時,保持對象鎖,仍然占有該鎖;其他線程無法訪問
          而wait()睡眠時,釋放對象鎖。其他線程可以訪問

          valitile關(guān)鍵字

          Java多線程中的輕量的同步機制有三個屬性

          • 保證可見性

          • 不保證原子性

          • 禁止指令重排

          JMM是Java內(nèi)存模型,也就是Java Memory Model,簡稱JMM,本身是一種抽象的概念,實際上并不存在,它描述的是一組規(guī)則或規(guī)范,通過這組規(guī)范定義了程序中各個變量(包括實例字段,靜態(tài)字段和構(gòu)成數(shù)組對象的元素)的訪問方式

          JMM關(guān)于同步的規(guī)定:

          線程解鎖前,必須把共享變量的值刷新回主內(nèi)存

          線程解鎖前,必須讀取主內(nèi)存的最新值,到自己的工作內(nèi)存

          加鎖和解鎖是同一把鎖

          線程的創(chuàng)建中,runnable和callable區(qū)別?

          相同點:都是接口,都可以編寫多線程程序,都采用Thread.start()啟動線程

          不同點:

          • 具體方法不同:一個是run,一個是call

          • Runnable沒有返回值;Callable可以返回執(zhí)行結(jié)果,是個泛型

          • Callable接口的call()方法允許拋出異常;Runnable的run()方法異常只能在內(nèi)部消化,不能往    上繼續(xù)拋

          • 它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結(jié)果。

          分布式鎖如何實現(xiàn)?

          分布式鎖的三種實現(xiàn)方式:mysql redis(性能最高) zk(安全性最高)

          特征:

          1.獨占排他

          2.可重入性(可選)

          3.防止死鎖的發(fā)生

          4.防誤刪

          5.自動續(xù)期

          6.原子性:加鎖 解鎖

          7.redlock算法

          實現(xiàn):

          setnx實現(xiàn)獨占排他

          防止死鎖發(fā)生 過期時間 set key value ex 3000 nx

          lua腳本 或者 set key value ex 3000 nx  保證原子性

          為了做到防誤刪 給鎖添加過期時間

          監(jiān)控子線程做到自動續(xù)期

          總結(jié):

          加鎖:set key value ex 3000 nx 實現(xiàn)獨占排他 設(shè)置過期時間,防止死鎖發(fā)生,并保證原子性

          解鎖:lua腳本解鎖,防止誤刪并保證原子性

          監(jiān)控子線程做到自動續(xù)期

          重試:獲取鎖失敗的線程,重試

          可重入鎖:使用了lua腳本,hash數(shù)據(jù)結(jié)構(gòu),每重入一次value+1,每釋放一次value-1,直到value=0時,刪除鎖

          redisson分布鎖框架:

          ReentrantLock可重入鎖

          FireLock公平鎖

          RedLock紅鎖:大部分實例獲取到鎖

          ReadWriteLock讀寫鎖

          CountDownLatch閉鎖

          Semaphore分布式信號量

          怎么做到自動續(xù)期:看門狗子線程

          怎么防止集群情況下鎖失效:RedLock

           

          AOP封裝緩存和分布式鎖:

          注解 + 環(huán)繞通知

          IOC原理:反轉(zhuǎn)控制 大工廠 + 配置文件 + 反射

          4種初始化方式:無參構(gòu)造器 靜態(tài)工廠 實例化工程  factoryBean

          DI依賴注入:依賴于IOC

             2種方式:setter注入 構(gòu)造方法

          AOP原理:動態(tài)代理(JDK代理 CGLIB代理)

          @Aspect @Before @Around

          切入點表達(dá)式:execution(* com.atguigu.gmall.pms.service.*.*(..)) annotation(注解的全路徑)

          JoinPoint

          joinPoint.getArgs()

          joinPoint.getTarget().getClass()

          (MethodSignature)joinPoint.getSignature

          線程池創(chuàng)建方式,和前兩個參數(shù)

          線程池創(chuàng)建的兩種方式:Executors工具類和ThreadPoolExecutor類

          • 核心線程數(shù)

          • 存活時間

          • 時間單位

          • 最大線程數(shù)

          • 阻塞隊列

          • 線程工廠

          • 拒絕策略

           mq怎么保證消息不丟失

          • 提供者消息確認(rèn) 

          • 消費者消息確認(rèn)(手動確認(rèn)和自動確認(rèn),springAMQP有三種:NONE AUTO MANUAL)

          • 消息持久化(交換機、隊列、消息)

          線程工具類介紹一下

          Executors工具類線程池創(chuàng)建的方法有:固定數(shù)的,單一的,可變的。

          線程池不允許使用Executors去創(chuàng)建,而是通過ThreadToolExecutors的方式,這樣的處理方式讓寫的同學(xué)更加明確線程池的運行規(guī)則,規(guī)避資源耗盡的風(fēng)險

          Executors返回的線程池對象弊端如下:

          • FixedThreadPool和SingleThreadPool:

          • 運行的請求隊列長度為:Integer.MAX_VALUE,可能會堆積大量的請求,從而導(dǎo)致OOM

          • CacheThreadPool和ScheduledThreadPool

          • 運行的請求隊列長度為:Integer.MAX_VALUE,可能會堆積大量的請求,從而導(dǎo)致OO

          線程的狀態(tài)

          創(chuàng)建 就緒 運行 阻塞 死亡

          死鎖是怎么發(fā)生的,怎么解決

          死鎖的四個必要條件

          • 互斥

          解決方法:把互斥的共享資源封裝成可同時訪問

          • 占有且等待

          解決方法:進(jìn)程請求資源時,要求它不占有任何其它資源,也就是它必須一次性申請到所有的資源,這種方式會導(dǎo)致資源效率低。

          • 非搶占式

          解決方法:如果進(jìn)程不能立即分配資源,要求它不占有任何其他資源,也就是只能夠同時獲得所有需要資源時,才執(zhí)行分配操作

          • 循環(huán)等待

          解決方法:對資源進(jìn)行排序,要求進(jìn)程按順序請求資源。

          如何保證線程的同步?

          使用synchronized ReentrandLock保證線程同步

          Java鎖的基本狀態(tài)

          無鎖 偏向鎖 輕量級鎖 重量級鎖

          一個對象加鎖的狀態(tài)?

          鎖是存在哪里的呢?

          鎖存在Java的對象頭中的Mark Work。Mark Work默認(rèn)不僅存放著鎖標(biāo)志位,還存放對象hashCode等信息。運行時,會根據(jù)鎖的狀態(tài),修改Mark Work的存儲內(nèi)容。如果對象是數(shù)組類型,則虛擬機用3個字寬存儲對象頭,如果對象是非數(shù)組類型,則用2字寬存儲對象頭。在32位虛擬機中,一字寬等于四字節(jié),即32bit。

          字寬(Word): 內(nèi)存大小的單位概念, 對于 32 位處理器 1 Word = 4 Bytes, 64 位處理器 1 Word = 8 Bytes

          每一個 Java 對象都至少占用 2 個字寬的內(nèi)存(數(shù)組類型占用3個字寬)。

          第一個字寬也被稱為對象頭Mark Word。對象頭包含了多種不同的信息, 其中就包含對象鎖相關(guān)的信息。

          第二個字寬是指向定義該對象類信息(class metadata)的指針

          四種狀態(tài)

          鎖有四種狀態(tài):無鎖狀態(tài)、偏向鎖、輕量級鎖、重量級鎖

          隨著鎖的競爭,鎖的狀態(tài)會從偏向鎖到輕量級鎖,再到重量級鎖。而且鎖的狀態(tài)只有升級,沒有降級。也就是只有偏向鎖->輕量級鎖->重量級鎖,沒有重量級鎖->輕量級鎖->偏向鎖。

          鎖狀態(tài)的改變是根據(jù)競爭激烈程度進(jìn)行的,在幾乎無競爭的條件下,會使用偏向鎖,在輕度競爭的條件下,會由偏向鎖升級為輕量級鎖, 在重度競爭的情況下,會升級到重量級鎖。

          你為什么說synchronized是重量級鎖?

          操作系統(tǒng)維護(hù)鎖的狀態(tài)使當(dāng)前線程掛起外,只要是synchronized,一有競爭也會引起阻塞,阻塞和喚醒操作又涉及到了上下文操作,大量消耗CPU,降低性能。

          重量級鎖是需要依靠操作系統(tǒng)來實現(xiàn)互斥鎖的,這導(dǎo)致大量上下文切換,消耗大量CPU,影響性能。

          公平鎖和非公平鎖的區(qū)別?

          • 公平鎖

          是指多個線程按照申請鎖的順序來獲取鎖,類似于排隊買飯,先來后到,先來先服務(wù),就是公平的,也就是隊列

          • 非公平鎖

          是指多個線程獲取鎖的順序,并不是按照申請鎖的順序,有可能申請的線程比先申請的線程優(yōu)先獲取鎖,在高并發(fā)環(huán)境下,有可能造成優(yōu)先級翻轉(zhuǎn),或者饑餓的線程(也就是某個線程一直得不到鎖)

          • 如何創(chuàng)建

          并發(fā)包中ReentrantLock的創(chuàng)建可以指定析構(gòu)函數(shù)的boolean類型來得到公平鎖或者非公平鎖,默認(rèn)是非公平鎖

          /**
          * 創(chuàng)建一個可重入鎖,true 表示公平鎖,false 表示非公平鎖。默認(rèn)非公平鎖
          */
          Lock lock = new ReentrantLock(true);

          • 兩者區(qū)別

          公平鎖:就是很公平,在并發(fā)環(huán)境中,每個線程在獲取鎖時會先查看此鎖維護(hù)的等待隊列,如果為空,或者當(dāng)前線程是等待隊列中的第一個,就占用鎖,否者就會加入到等待隊列中,以后安裝FIFO的規(guī)則從隊列中取到自己

          非公平鎖:非公平鎖比較粗魯,上來就直接嘗試占有鎖,如果嘗試失敗,就再采用類似公平鎖那種方式。題外話

          Java ReenttrantLock通過構(gòu)造函數(shù)指定該鎖是否公平,默認(rèn)是非公平鎖,因為非公平鎖的優(yōu)點在于吞吐量比公平鎖大,對于synchronized而言,也是一種非公平鎖

          JUC下的工具類有哪些

          CountDownLatch

          概念

          讓一些線程阻塞直到另一些線程完成一系列操作才被喚醒

          CountDownLatch主要有兩個方法,當(dāng)一個或多個線程調(diào)用await方法時,調(diào)用線程就會被阻塞。其它線程調(diào)用CountDown方法會將計數(shù)器減1(調(diào)用CountDown方法的線程不會被阻塞),當(dāng)計數(shù)器的值變成零時,因調(diào)用await方法被阻塞的線程會被喚醒,繼續(xù)執(zhí)行

          概念

          和CountDownLatch相反,需要集齊七顆龍珠,召喚神龍。也就是做加法,開始是0,加到某個值的時候就執(zhí)行

          CyclicBarrier的字面意思就是可循環(huán)(cyclic)使用的屏障(Barrier)。它要求做的事情是,讓一組線程到達(dá)一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程到達(dá)屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續(xù)干活,線程進(jìn)入屏障通過CyclicBarrier的await方法

          概念

          信號量主要用于兩個目的

          一個是用于共享資源的互斥使用

          另一個用于并發(fā)線程數(shù)的控制

          git的合并沖突

          沖突是指當(dāng)你在提交或者更新代碼時被合并的文件與當(dāng)前文件不一致

          常見沖突的生產(chǎn)場景如下

          更新代碼

          提交代碼

          多個分支代碼合并到一個分支時

          多個分支向同一個遠(yuǎn)端分支推送代碼時

          git的合并中產(chǎn)生沖突的具體情況:
          <1>兩個開發(fā)者(分支中)修改了同一個文件(不管什么地方)
          <2>兩個開發(fā)者(分支中)修改了同一個文件的名稱
            注意:兩個分支中分別修改了不同文件中的部分,不會產(chǎn)生沖突,可以直接將兩部分合并。

            總結(jié):上面各種情況的本質(zhì)都是,當(dāng)前文件與合并文件不一致,因此不論哪種情況其解決沖突的方法是一樣的。

          最后:代碼沖突之后,和為貴!!!

          分布式鎖用的是什么?

          MySQL redis zk三種方式

          線程中sleep()、 wait()、 join()、 yield()的區(qū)別

          • sleep()方法

          sleep()方法是讓當(dāng)前運行這一句的代碼休眠指定的一段時間,在休眠時間里,線程不會獲取CPU的執(zhí)行權(quán),如果當(dāng)前線程持有了對象鎖,是不會釋放對象鎖的,過了休眠時間線程自動轉(zhuǎn)為可運行狀態(tài)。

          • wait()方法

          wait()方法是讓當(dāng)前線程等待一段時間,這段時間里,線程將一直處于阻塞狀態(tài),直到被notify()或者notifyAll()方法喚醒,如果線程持有對象鎖,會釋放對象鎖,wait()和notify()方法都是object對象的方法,而不是線程獨有的方法,另外,wait()和notify()方法運行時必須持有鎖(即代碼要是同步的),否則會報錯,wait()會釋放鎖也是因為notify()要得到鎖,但是notify()方法并不會釋放鎖,所以一般把notify()放在代碼最后。

          • yield()方法

          yield()方法是線程完成自己的任務(wù)時,自己回到可運行狀態(tài),參與爭奪CPU執(zhí)行權(quán),且線程不會釋放對象鎖。

          • join()方法

          在一個線程A中運行了線程B的join()方法,則線程A必須等到線程B執(zhí)行完后才能開始執(zhí)行,可以用于保證線程的執(zhí)行先后順序。

          • interrupt()

          interrupt()方法是為線程設(shè)立一個中斷標(biāo)志,相當(dāng)于一個通知,但是線程是否中斷,是有線程自己決定的,也就是說線程調(diào)用interrpt()方法不代表著線程一定會中斷,如果線程中運行了sleep()方法,并拋出InterruptedException,那么當(dāng)前線程的中斷狀態(tài)會被重置。

          • isInterrupted()

          isInterrupted()方法是判斷調(diào)用該方法的線程是否處于中斷狀態(tài),但是不會重置線程狀態(tài)。




          版權(quán)聲明本文為CSDN博主「MelonSeedD」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

          原文鏈接

          https://blog.csdn.net/Ding9610/article/details/108432903





          鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

          ??????

          ??長按上方微信二維碼 2 秒





          感謝點贊支持下哈 

          瀏覽 28
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品三级在线 | 俺来也俺去也 | 黄色操逼动漫在线观看 | 一本色道综合久久欧美日韩精品 | 国产高潮视频在线观看 |