1. 程式人生 > >併發程式設計——上線文切換、死鎖

併發程式設計——上線文切換、死鎖

1、什麼是執行緒上線文切換

時間片是CPU分配給執行緒執行的時間,由於時間片非常短,所以CPU通過不停切換執行緒執行。時間片時長一般幾十毫秒。

在切換執行緒前會儲存當前任務執行緒的狀態,以便下次再切回這個任務時可以再載入這個任務 的狀態。任務從儲存到再次載入的過程是一次上線文切換

2、死鎖

執行緒死鎖是指由於兩個或者多個執行緒互相持有對方所需要的資源,導致這些執行緒處於等待狀態,無法前往執行。

public class DeadLock {
    private final Object left = new Object();
    private final Object right = new Object();

    public static void main(String[] args) {
        int n = 10;
        DeadLock deadLock = new DeadLock();
        for (int i = 0; i < n; i++) {

            deadLock.deadLock();
        }
    }

    public void deadLock() {
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (left) {
                    System.out.println("hello left,i need right,so ...");
                    synchronized (right) {
                        System.out.println("hello right,i am come in.");
                    }
                }
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (right) {
                    System.out.println("hello right,i need left,so ...");
                    synchronized (left) {
                        System.out.println("hello left,i am come in.");
                    }
                }
            }
        });

        threadA.start();
        threadB.start();
    }


}

避免死鎖的方法:

  • 避免一個執行緒同時獲取多個鎖;
  • 避免一個執行緒在鎖內同時佔用多個資源,儘量保證一個執行緒佔用一個資源。
  • 嘗試使用定時鎖,使用lock.tryLock(timeout) 替代使用內部鎖機制;
  • 對於資料庫鎖,加鎖和解鎖必須在一個數據庫連線裡,否則會出現解鎖失敗的情況。

參考:《JAVA併發程式設計的藝術》

相關推薦

併發程式設計——上線切換

1、什麼是執行緒上線文切換 時間片是CPU分配給執行緒執行的時間,由於時間片非常短,所以CPU通過不停切換執行緒執行。時間片時長一般幾十毫秒。 在切換執行緒前會儲存當前任務執行緒的狀態,以便下次再切回這個任務時可以再載入這個任務 的狀態。任務從儲存到再次載入的過程是一次上

Java併發程式設計(9):(含程式碼)

JAVA大資料中高階架構 2018-11-10 14:04:32當執行緒需要同時持有多個鎖時,有可能產生死鎖。考慮如下情形: 執行緒A當前持有互斥所鎖lock1,執行緒B當前持有互斥鎖lock2。接下來,當執行緒A仍然持有lock1時,它試圖獲取lock2,因為執行緒B正持有lock2,因此執行緒A會阻塞等

Java併發程式設計系列之十二 飢餓和活

                        死鎖發生在一個執

python 之 併發程式設計(守護程序互斥IPC通訊機制)

9.5 守護程序 主程序建立守護程序   其一:守護程序會在主程序程式碼執行結束後就立即終止   其二:守護程序內無法再開啟子程序,否則丟擲異常:AssertionError: daemonic processes are not allowed to have children 注意:程序之間是互相

Java併發程式設計實戰(4)-

在這篇文章中,我們主要討論一下死鎖及其解決辦法。 [toc] # 概述 在上一篇文章中,我們討論瞭如何使用一個互斥鎖去保護多個資源,以銀行賬戶轉賬為例,當時給出的解決方法是基於Class物件建立互斥鎖。 這樣雖然解決了同步的問題,但是能在現實中使用嗎?答案是不可以,尤其是在高併發的情況下,原因是我們使用

併發性:互斥和同步和飢餓

一、與併發相關的關鍵術語: 原子操作:要保證指令的序列作為一個組來操作執行,要麼都不執行;要麼執行要直接執行到指令完畢,中間不能中斷 臨界區:是一段程式碼,在這段程式碼中程序將訪問共享資源,當有一個程序在這段程式碼中執行時,其他程序不能在這段程式碼中執行 死

十五併發程式設計之寫自己的公平

package com.roocon.thread.ta3; import java.util.ArrayList; import java.util.List; public class FairLock { private boolean isLocked = false;

數據字典

strong column 訪問權限 pfile splay sum 占用 over 動態 數據字典、死鎖 1、靜態數據字典 1.1、實用靜態數據字典 1.2、運用靜態數據字典 2、動態數據字典 2.1、實用動態性能視圖 2.2、運用動態性能視圖 3、

【SQL Server學習筆記】事務鎖定阻塞

body sqlserve distrib reset reads cli ast function pre http://blog.csdn.net/sqlserverdiscovery/article/details/7712068 Column nameData

Python入門學習-DAY36-GIL全局解釋器現象與遞歸信號量Event事件線程queue

可重入 def 代碼 threading 結果 運算 分析 rand pen 一、GIL全局解釋器鎖 1. 什麽是GIL全局解釋器鎖 GIL本質就是一把互斥鎖,相當於執行權限 在Cpython解釋器下,如果想實現並行可以開啟多個進程 2. 為何要有GIL 我們首先要知道,一

python-GIL遞歸及線程補充

self. for 提升 數字 test with edi 數據 thread 一、GIL介紹 GIL全稱 Global Interpreter Lock ,中文解釋為全局解釋器鎖。它並不是Python的特性,而是在實現python的主流Cpython解釋器時所引入的一個

GIL全局解釋器遞歸信號量Event事件線程Queue

main 圖片 加鎖 2.0 最大 sin 解決 mutex 帶來 GIL全局解釋器鎖   GIL本質就是一把互斥鎖,和所有互斥鎖本質一樣,都是把並發運行變成串行,以此來控制同一時間內共享數據只能被一個任務修改,進而保證數據安全   保護不同的數據的安全,就應該加不同的鎖。

MySQL技術內幕 InnoDB儲存引擎:阻塞升級

1、堵塞 因為不同鎖之間的相容性關係,在有些時刻一個事務中的鎖需要等待另外一個事務中的鎖釋放它所佔用的資源,這就是堵塞。 引數innodb_lock_wait_timeout用來控制等待的時間,預設50秒,是可以動態設定的。 引數innodb_rollback_on

執行緒的上線切換

執行緒的上線文切換: 指的是執行緒之間執行權的切換   執行緒的上線文切換過於頻繁是會影響程式效能的 , 我們減少不必要的上下文切換: 從業務上去減少上下文切換可以按照資料的id拆分或者hash拆分不同的執行緒處理不同的業務(伺服器是多執行緒的情況下) 無鎖程式

Oracle中發生表加的原因,檢視,與解決方法

一.表加鎖、死鎖出現的現象 1.對資料庫操作update,insert,delete時候,資料庫無法更新,操作等待時長,操作結果不發生改變 2.在程式中,底層(資料訪問層)操作時候,不成功,資料庫連線超時,無法操作,或者操作等待時長等現象 【加鎖的原理】:比如一個操作在進行修改一表,它

python學習第37天GIL現象與遞歸信號量Event時間線程queue

++ func 修改 遞歸 切換 使用 解釋 計算 通過 一、GIL鎖 1. 什麽是GIL全局解釋器鎖 定義: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multip

作業系統(10)程序--概念;處理方法:預防避免銀行家演算法檢測

文章目錄 1. 死鎖概念 2. 死鎖處理方法 1. 死鎖預防 2. 死鎖避免 3. 銀行家演算法 4. 死鎖檢測 1. 死鎖概念 死鎖是指:由於競爭資源或者通

jstack簡單使用,定位迴圈執行緒阻塞等問題

當我們執行java程式時,發現程式不動,但又不知道是哪裡出問題時,可以使用JDK自帶的jstack工具去定位; 廢話不說,直接上例子吧,在window平臺上的; 一、死迴圈 package software.architect.OtherAnalyzer.main; public

python 64式: 第17式或程序hang住除錯方法

步驟1:下載python-debuginfo 如果已經發現有/etc/yum.repos.d/xxx-Debuginfo.repo,就不需要下載 修改 /etc/yum.repos.d/xxx-Debuginfo.repo 將其中的 enabled=0 修改為 enabled=1 步驟2:下載gd

併發程式設計系列:NIOBIOAIO的區別,及NIO的應用和框架選型

文章目錄 AIO、BIO、NIO的區別 NIO的3個核心概念 NIO的應用和框架 談到併發程式設計就不得不提到NIO,以及相關的Java NIO框架Netty等,並且在很多面試中也經常提到NIO和AIO、同步和非同步、阻塞