国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了JUC并發(fā)編程(終章)各種鎖的理解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

各種鎖的理解

公平鎖、非公平鎖

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

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

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

所有的鎖都是可重入鎖

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

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方法,所以當(dāng)我們調(diào)用ems方法獲取到鎖時,也把call方法的synchronized鎖獲取到了。

錯誤理論

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

正確理論

  • 當(dāng)線程A運行ems方法后運行call方法時ems方法的鎖還未釋放時就拿到了call方法中的鎖,當(dāng)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(不斷嘗試直至成功)

已經(jīng)見過了,就是unsafe中的自增getAndAddInt方法中的do-while循環(huán)就是一把自旋鎖

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

自己寫一把鎖

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,就會一直循環(huán)
        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();
    }
}
死鎖

死鎖是什么

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

死鎖測試

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定位進程號

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

查看當(dāng)前java活著的進程

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

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

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

查找到一個死鎖問題!

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

1、查看異常

2、查看日志

3、查看堆棧信息文章來源地址http://www.zghlxwxcb.cn/news/detail-746426.html

到了這里,關(guān)于JUC并發(fā)編程(終章)各種鎖的理解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 第九章 JUC并發(fā)編程

    第九章 JUC并發(fā)編程

    http://t.csdn.cn/UgzQi 使用 AQS加 Lock 接口實現(xiàn)簡單的不可重入鎖 早期程序員會自己通過一種同步器去實現(xiàn)另一種相近的同步器,例如用可重入鎖去實現(xiàn)信號量,或反之。這顯然不夠優(yōu)雅,于是在 JSR166(java 規(guī)范提案)中創(chuàng)建了 AQS,提供了這種通用的同步器機制。 AQS 要實現(xiàn)的功能

    2023年04月08日
    瀏覽(21)
  • 【JUC并發(fā)編程】

    【JUC并發(fā)編程】

    本筆記內(nèi)容為狂神說JUC并發(fā)編程部分 目錄 一、什么是JUC 二、線程和進程 1、概述? 2、并發(fā)、并行 3、線程有幾個狀態(tài)? 4、wait/sleep 區(qū)別 三、Lock鎖(重點)? 四、生產(chǎn)者和消費者問題 五、八鎖現(xiàn)象 六、集合類不安全? 七、Callable ( 簡單 ) 八、常用的輔助類(必會) 1、CountDown

    2024年02月09日
    瀏覽(11)
  • JUC并發(fā)編程14 | ThreadLocal

    JUC并發(fā)編程14 | ThreadLocal

    尚硅谷JUC并發(fā)編程(100-111) ThreadLocal是什么? ThreadLocal 提供 線程局部變量 。這些變量與正常的變量有所不同,因為每一個線程在訪問ThreadLocal實例的時候(通過其get或set方法)都有自己的、獨立初始化的變量副本。ThreadLocal實例通常是類中的私有靜態(tài)字段,使用它的目的是

    2024年02月04日
    瀏覽(23)
  • JUC 高并發(fā)編程基礎(chǔ)篇

    JUC 高并發(fā)編程基礎(chǔ)篇

    ? 1、什么是 JUC ? 2、Lock 接口 ? 3、線程間通信 ? 4、集合的線程安全 ? 5、多線程鎖 ? 6、Callable 接口 ? 7、JUC 三大輔助類: CountDownLatch CyclicBarrier Semaphore ? 8、讀寫鎖: ReentrantReadWriteLock ? 9、阻塞隊列 ? 10、ThreadPool 線程池 ? 11、Fork/Join 框架 ? 12、CompletableFuture 1 什么

    2024年02月07日
    瀏覽(20)
  • JUC并發(fā)編程之原子類

    目錄 1. 什么是原子操作 1.1?原子類的作用 1.2?原子類的常見操作 原子類的使用注意事項 并發(fā)編程是現(xiàn)代計算機應(yīng)用中不可或缺的一部分,而在并發(fā)編程中,處理共享資源的并發(fā)訪問是一個重要的問題。為了避免多線程訪問共享資源時出現(xiàn)競態(tài)條件(Race Condition)等問題,J

    2024年02月13日
    瀏覽(18)
  • 【JUC并發(fā)編程】讀寫鎖:ReadWriteLock

    【JUC并發(fā)編程】讀寫鎖:ReadWriteLock

    1. 不使用讀寫鎖 2. 使用讀寫鎖 ReadWriteLock讀寫鎖特點 ① 寫鎖是獨占鎖,一次只能被一個線程占有 ② 讀鎖是共享鎖,多個線程可以同時占有 讀-讀:可以共存 讀-寫:不能共存 寫-寫:不能共存

    2024年02月13日
    瀏覽(23)
  • JUC并發(fā)編程原理精講(源碼分析)

    JUC并發(fā)編程原理精講(源碼分析)

    JUC即 java.util.concurrent 涉及三個包: java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 普通的線程代碼: Thread Runnable 沒有返回值、效率相比入 Callable 相對較低! Callable 有返回值!【工作常用】 進程 :是指一個內(nèi)存中運行的程序,每個進程都有一個獨立的內(nèi)存空間,

    2024年02月02日
    瀏覽(27)
  • JUC并發(fā)編程學(xué)習(xí)(十三)ForkJoin

    JUC并發(fā)編程學(xué)習(xí)(十三)ForkJoin

    什么是ForkJoin ForkJoin在JDK1.7,并發(fā)執(zhí)行任務(wù)!大數(shù)據(jù)量時提高效率。 大數(shù)據(jù):Map Reduce(把大任務(wù)拆分成小任務(wù)) ForkJoin特點:工作竊取 為什么可以取竊取其他線程的任務(wù)呢?因為這里面維護的都是 雙端隊列 (即隊列的兩端都可以取元素) ForkJoin操作 在java.util.concurrent下的接

    2024年02月05日
    瀏覽(23)
  • JUC并發(fā)編程之volatile詳解

    JUC并發(fā)編程之volatile詳解

    目錄 ? 1. volatile 1.1?volatile的作用 1.1.1?變量可見性 1.1.2?禁止指令重排序 1.2 volatile可見性案例 1.3 volatile非原子性案例 1.4 volatile 禁止重排序 1.5 volatile 日常使用場景 送書活動 ? 在并發(fā)編程中,多線程操作共享的變量時,可能會導(dǎo)致線程安全問題,如數(shù)據(jù)競爭、可見性

    2024年02月14日
    瀏覽(22)
  • JUC并發(fā)編程之AQS原理

    JUC并發(fā)編程之AQS原理

    全稱是 AbstractQueuedSynchronizer,是阻塞式鎖和相關(guān)的同步器工具的框架 特點: 用 state 屬性來表示資源的狀態(tài)(分獨占模式和共享模式),子類需要定義如何維護這個生態(tài),控制如何獲取鎖和釋放鎖 getState - 獲取 state 狀態(tài) setState - 設(shè)置 state 狀態(tài) compareAndSetState - cas 機制設(shè)置 s

    2023年04月18日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包