成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺談Java中鎖的問題

fox_soyoung / 1083人閱讀

摘要:之前我們簡單的討論了一下關于中的同步還有一些鎖優(yōu)化的問題,今天我們就來簡單的聊一聊關于中的死鎖問題。這里顯示兩個線程的狀態(tài)現(xiàn)在是處于阻塞狀態(tài),然后都在等待鎖的獲取,我們再繼續(xù)往下看。

之前我們簡單的討論了一下關于Java中的同步還有一些鎖優(yōu)化的問題,今天我們就來簡單的聊一聊關于Java中的死鎖問題。

這個問題我們在開發(fā)的時候,或多或少都能遇到,對業(yè)務邏輯沒有正確的梳理,又或者是在多線程的情況下,對程序的執(zhí)行順序有理解上的偏差等等,但是這種問題有時候執(zhí)行代碼是看不出來的,那我們今天就看一看如何使用簡單的命令來查看死鎖。

首先我們得寫一段有問題的程序,當然前提條件是先要明確什么是死鎖,這個問題在網(wǎng)上找有很多的資料,在這里我們就不重復敘述了,先來看一下代碼

class Lock extends Thread{

    private String lock1;
    
    private String lock2;
    
    Lock(String s1, String s2){
        this.lock1 = s1;
        this.lock2 = s2;
    }
    
    @Override
    public void run() {
        synchronized (lock1) {
            System.out.println(Thread.currentThread().getName() + " get " + lock1);
            try {
                Thread.sleep(1 * 1000);
                synchronized (lock2) {
                    System.out.println(Thread.currentThread().getName() + " get -- " + lock2);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    
}

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(new Lock(LOCK_1, LOCK_2));
        Thread thread2 = new Thread(new Lock(LOCK_2, LOCK_1));
        
        thread1.start();
        thread2.start();
        
        thread1.join();
        thread2.join();
    }

在這里我們用synchronized來嵌套兩層,然后賦予兩個線程兩個交互的鎖,那么這段代碼在大部分情況下會發(fā)生死鎖,但是我們的程序執(zhí)行下來沒有報錯,那這個該如何查看呢?JDK為我們提供了一些工具,我們來看一下,首先用jps這個命令查看當前的PID,這個就和ps命令差不多。

然后我們再用jstack來查看具體的棧信息,例如:jstack 9520,會打印很多的信息,我們看幾個比較重要的。

這里顯示兩個線程的狀態(tài)現(xiàn)在是處于阻塞狀態(tài),然后都在等待鎖的獲取,我們再繼續(xù)往下看。

這里很明確的指出線程3在等待一個鎖獲取,但是這個鎖被線程1持有,反過來也是一樣,線程1也在等待一個鎖獲取,但是這個鎖又被線程3持有,那么這里就產(chǎn)生了一個死鎖。

JDK的這些命令行工具能很好的幫助我們分析程序中的一些問題,但是我們在日常的開發(fā)工作中,該如何規(guī)避這些問題呢,其實我的建議只有一點,首先要明確理論,有了一定的理論做基礎,然后就是不斷的實踐采坑,這樣才能明白某些問題的點在哪里。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76759.html

相關文章

  • 淺談Java鎖的實現(xiàn)和優(yōu)化

    摘要:這兩種策略的區(qū)別就在于,公平策略會讓等待時間長的線程優(yōu)先執(zhí)行,非公平策略則是等待時間長的線程不一定會執(zhí)行,存在一個搶占資源的問題。 之前有一篇文章我們簡單的談到了Java中同步的問題,但是可能在平常的開發(fā)中,有些理論甚至是某些方式是用不到的,但是從程序的角度看,這些理論思想我們可以運用到我們的開發(fā)中,比如是不是應該一談到同步問題,就應該想到用synchronized?,什么時候應該用R...

    DevWiki 評論0 收藏0
  • 【推薦】最新200篇:技術文章整理

    摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復實現(xiàn)故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數(shù)據(jù)恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...

    BicycleWarrior 評論0 收藏0
  • 【推薦】最新200篇:技術文章整理

    摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復實現(xiàn)故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數(shù)據(jù)恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...

    tommego 評論0 收藏0

發(fā)表評論

0條評論

fox_soyoung

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<