<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      JUC并發編程(終章)各種鎖的理解

      各種鎖的理解

      公平鎖、非公平鎖

      公平鎖:先到先得(不可插隊)

      非公平鎖:達者為先(可插隊)---------->默認

      public ReentrantLock() {
          //默認非公平鎖
          sync = new NonfairSync();
      }
      
      //重載的構造方法,通過fair控制是否公平
      public ReentrantLock(boolean fair) {
          sync = fair ? new FairSync() : new NonfairSync();
      }
      
      可重入鎖(遞歸鎖)

      所有的鎖都是可重入鎖

      Synchronized版

      package org.example.lock;
      
      
      public class Demo01 {
          public static void main(String[] args) {
              phone1 p1 = new phone1();
              new Thread(()->{
                  p1.ems();
              },"A").start();
              new Thread(()->{
                  p1.ems();
              },"B").start();
          }
      }
      class phone1{
          public synchronized void ems(){
              System.out.println(Thread.currentThread().getName()+"---------->ems");
              call();
          }
          public synchronized void call(){
              System.out.println(Thread.currentThread().getName()+"---------->call");
          }
      }
      

      ems方法中包含了call方法,所以當我們調用ems方法獲取到鎖時,也把call方法的synchronized鎖獲取到了。

      錯誤理論

      • 當線程A運行ems方法后運行call方法時ems鎖釋放,線程B可以獲取到ems方法

      正確理論

      • 當線程A運行ems方法后運行call方法時ems方法的鎖還未釋放時就拿到了call方法中的鎖,當call方法的鎖釋放后ems方法的鎖才會釋放。線程B此時就可以運行ems方法了

      Lock版

      package org.example.lock;
      
      import java.util.concurrent.locks.Lock;
      import java.util.concurrent.locks.ReentrantLock;
      
      public class Demo02 {
          public static void main(String[] args) {
              phone2 p2 = new phone2();
              new Thread(()->{
                  p2.ems();
              },"A").start();
              new Thread(()->{
                  p2.ems();
              },"B").start();
          }
      }
      class phone2{
          Lock lock = new ReentrantLock();
          public  void ems(){
              lock.lock();
              try {
                  System.out.println(Thread.currentThread().getName()+"---------->ems");
                  call();
              } catch (Exception e) {
                  e.printStackTrace();
              } finally {
                  //等待call方法鎖解鎖后再解鎖
                  lock.unlock();
              }
      
          }
          public void call(){
              lock.lock();
              try {
                  System.out.println(Thread.currentThread().getName()+"---------->call");
              } catch (Exception e) {
                  e.printStackTrace();
              } finally {
                  lock.unlock();
              }
      
          }
      }
      
      自旋鎖

      spinlock(不斷嘗試直至成功)

      已經見過了,就是unsafe中的自增getAndAddInt方法中的do-while循環就是一把自旋鎖

      自己寫一把鎖

      package org.example.lock;
      
      import java.util.concurrent.TimeUnit;
      import java.util.concurrent.atomic.AtomicReference;
      
      public class SpinLockDemo {
          //int 0
          //Thread null
          public static AtomicReference<Thread> atomic = new AtomicReference<>();
      
          public static void lock(){
              Thread thread = Thread.currentThread();
              System.out.println("===============>"+thread.getName()+"===========>lock");
              //自旋鎖,若線程等于null,則compareAndSet為true,加!就為false,就會一直循環
              while (!atomic.compareAndSet(null,thread)){
      
              }
          }
          public static void unlock(){
              Thread thread = Thread.currentThread();
              System.out.println("===============>"+thread.getName()+"===========>unlock");
              //自旋鎖
              atomic.compareAndSet(thread,null);
          }
      
          public static void main(String[] args) throws InterruptedException {
              new Thread(()->{
                  try {
                      lock();
                      TimeUnit.SECONDS.sleep(10);
                  } catch (Exception e) {
                      e.printStackTrace();
                  } finally {
                      unlock();
                  }
              },"A").start();
              TimeUnit.SECONDS.sleep(1);
              new Thread(()->{
                  try {
                      lock();
                      TimeUnit.SECONDS.sleep(2);
                  } catch (Exception e) {
                      e.printStackTrace();
                  } finally {
                      unlock();
                  }
              },"B").start();
          }
      }
      
      死鎖

      死鎖是什么

      死鎖測試

      package org.example.lock;
      
      import java.util.concurrent.TimeUnit;
      
      public class DeadLockDemo {
          public static void main(String[] args) {
              String a = "A";
              String b = "B";
              new Thread(()->{new MyThread(a, b).run();},"A").start();
              new Thread(()->{new MyThread(b, a).run();},"B").start();
          }
      }
      class MyThread implements Runnable{
          private String lockA;
          private String lockB;
      
          public MyThread(String lockA, String lockB) {
              this.lockA = lockA;
              this.lockB = lockB;
          }
      
          @Override
          public void run() {
              synchronized (lockA){
                  System.out.println(Thread.currentThread().getName()+"lock:"+lockA+"=>get"+lockB);
                  try {
                      TimeUnit.SECONDS.sleep(2);
                  } catch (InterruptedException e) {
                      throw new RuntimeException(e);
                  }
                  synchronized (lockB){
                      System.out.println(Thread.currentThread().getName()+"lock:"+lockB+"=>get"+lockA);
                  }
              }
          }
      }
      

      程序突然卡住死鎖如何排查?

      1、使用jps-l定位進程號

      查看當前java活著的進程

      2、使用jstack 進程號查看死鎖問題

      查找到一個死鎖問題!

      面試或者工作中排查問題:

      1、查看異常

      2、查看日志

      3、查看堆棧信息

      posted @ 2023-11-16 17:09  高同學,你好  閱讀(169)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 伊人色综合久久天天小片| 成在人线av无码免费看网站直播| 亚洲精品国产字幕久久麻豆| 日本55丰满熟妇厨房伦| 日韩高清国产中文字幕| 欧洲精品码一区二区三区| 痉挛高潮喷水av无码免费| 91青青草视频在线观看| 真人无码作爱免费视频| 国产啪视频免费观看视频| 国产在线精品中文字幕| 日韩乱码人妻无码中文字幕视频| 欧美 变态 另类 人妖| 国产精品无遮挡猛进猛出| 亚洲香蕉av一区二区蜜桃| 一区二区三区激情都市| 推油少妇久久99久久99久久| 最近中文字幕免费手机版| 中文亚洲成A人片在线观看| 性色av免费观看| 国产在线98福利播放视频| 国产亚洲精品第一综合另类| 中文字幕亚洲制服在线看| 精品尤物国产尤物在线看| 无遮挡aaaaa大片免费看| 91精品国产蜜臀在线观看| 国产精品 自在自线| 亚洲avav天堂av在线网爱情| 人妻无码| 在线免费观看毛片av| 绯色蜜臀av一区二区不卡| 国产午夜美女福利短视频| 99re6在线视频精品免费下载| 精品视频一区二区福利午夜| 日韩人妻系列无码专区| 亚洲AV成人片不卡无码| 久青草视频在线观看免费| 国产精品久久久久久妇女| 野花香视频在线观看免费高清版| 国产+亚洲+制服| 国内熟妇人妻色在线三级|