java中可重入鎖的學習總結

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

? ? ? 經常看到網上的人說,可重入鎖一詞,但是總是沒怎么了解,到底什么是可重入鎖,一直是一個模糊的概念,下面來大致總結一下。

可重入鎖:指的是同一個線程多次試圖獲取它所占有的鎖,請求會成功。當釋放鎖的時候,直到重入次數清零,鎖才釋放完畢。

?? ? ?再之前的我的博客:java synchronized關鍵字的用法--對象鎖和類鎖

http://my.oschina.net/u/1540325/blog/682950

里面最后我貼了一個程序:

public class MultiLock {public synchronized void f1(int count, String threadName) {if (count-- > 0) {Print.print(threadName + ":f1() calling f2() with count " + count);f2(count, threadName);}}public synchronized void f2(int count, String threadName) {if (count-- > 0) {Print.print(threadName + ":f2() calling f1() with count " + count);f1(count, threadName);}}public static void main(String[] args) throws Exception {final MultiLock multiLock = new MultiLock();new Thread() {public void run() {String name = Thread.currentThread().getName();multiLock.f1(10, name);}}.start();new Thread() {public void run() {String name = Thread.currentThread().getName();multiLock.f2(10, name);}}.start();}
}
輸出結果如下:Thread-1:f2() calling f1() with count 9
Thread-1:f1() calling f2() with count 8
Thread-1:f2() calling f1() with count 7
Thread-1:f1() calling f2() with count 6
Thread-1:f2() calling f1() with count 5
Thread-1:f1() calling f2() with count 4
Thread-1:f2() calling f1() with count 3
Thread-1:f1() calling f2() with count 2
Thread-1:f2() calling f1() with count 1
Thread-1:f1() calling f2() with count 0
Thread-0:f1() calling f2() with count 9
Thread-0:f2() calling f1() with count 8
Thread-0:f1() calling f2() with count 7
Thread-0:f2() calling f1() with count 6
Thread-0:f1() calling f2() with count 5
Thread-0:f2() calling f1() with count 4
Thread-0:f1() calling f2() with count 3
Thread-0:f2() calling f1() with count 2
Thread-0:f1() calling f2() with count 1
Thread-0:f2() calling f1() with count 0

當時就覺得奇怪,在f1()里面調用了synchronized的f2(),當時只知道是可以,不知道具體原因,現在明白了,因為synchronized是可重入的鎖,所以同一個對象的synchronized的方法調用另外一個synchronized方法是不需要再次獲取鎖的。

?

synchronized和lock都是可重入的鎖,可以防止死鎖,相對于可重入的鎖有一種自旋鎖,后面再做研究。

轉載于:https://my.oschina.net/u/1540325/blog/688263

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458398.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458398.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458398.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle DB優化

http://www.jb51.net/article/77876.htm http://www.jb51.net/article/56881.htm http://danni505.blog.51cto.com/15547/1163711/ http://blog.csdn.net/giianhui/article/details/8172786轉載于:https://www.cnblogs.com/diyunpeng/p/5132392.html

設置View單個圓角

#pragma mark - 設置View單個圓角 (void)addCornerWithView:(UIView *)aView type:(UIRectCorner)aCorners size:(CGSize)aSize { // 根據矩形畫帶圓角的曲線 UIBezierPath *maskPath [UIBezierPath bezierPathWithRoundedRect:aView.bounds byRoundingCorners:aCorn…

Python 數據類型

簡述Python 中的每個值都有一個數據類型。在 Python 編程中,一切(萬物)皆對象,數據類型實際上是類,變量是這些類的實例(對象)。簡述數據類型Number數字String字符串List列表Tuple元組Set集合Dic…

基于用戶投票的排名算法(一):Delicious和Hacker News

互聯網的出現,意味著"信息大爆炸"。 用戶擔心的,不再是信息太少,而是信息太多。如何從大量信息之中,快速有效地找出最重要的內容,成了互聯網的一大核心問題。 各種各樣的排名算法,是目前過濾信息…

iOS 修改工程名

一兩個月之前,公司要求將現在的項目(發貨端和接單端在一個項目里),拆分成兩個項目分別是接單端項目和發貨端項目,原有的項目還不能下架。這種情況就要考慮蘋果審核查代碼的重復率的問題了。老板的要求除了改變項目的主…

Windows 下 Python 環境搭建

簡述Python 是跨平臺的,可以運行在 Windows、Mac OS X 和各種 Linux/Unix 系統上。在學習 Python 之前,首先要搭建 Python 環境。完成后,會得到 Python 解釋器(負責運行 Python 程序的),一個命令行交互環境…

面試中關于Java你所需知道的的一切

本篇文章會對面試中常遇到的Java技術點進行全面深入的總結,幫助我們在面試中更加得心應手,不參加面試的同學也能夠借此機會梳理一下自己的知識體系,進行查漏補缺。 1. Java中的原始數據類型都有哪些,它們的大小及對應的封裝類是什…

利用BBRSACryptor實現iOS端的RSA加解密

背景 RSA這種非對稱加密被廣泛的運用于網絡數據的傳輸,但其在iOS上很難直接實現,BBRSACryptor框架通過移植openssl實現了iOS端的RSA,本文將介紹如何使用BBRSACryptor生成證書,加載公鑰,以及后端如何用php讀取證書&…

UIView轉UIimage

/** 將 UIView 轉換成 UIImage param view 將要轉換的View return 新生成的 UIImage 對象 */ - (UIImage *)yj_convertCreateImageWithUIView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); CGContextRef ctx UIGraphicsGetCurrentContext…

Linq 合并數據并相加

有幾條數據是這樣的 Person 123 456 789 Person 321 654 987 想合并成 Person 444 1110 1776 直接一條linq搞定 var newQuery from p in query group p by p.Name into gselect new { Name g.Name, Value g.Sum(x > x.Value) }; 轉…

python 各種模塊學習

from:https://blog.csdn.net/weiwangchao_/article/details/70570508轉載:。。。。Python的模塊大全,很全,有詳細介紹!另外附Python兩個教程1. Python詳細教程(廖雪峰的官方網站,語言簡潔&#…

Linux(Fedora21)安裝google chrome瀏覽器

2019獨角獸企業重金招聘Python工程師標準>>> Linux(Fedora21)安裝Google Chrome瀏覽器 qianghaoaho(孤狼) 1.添加google chrome的源: cd /etc/yum.repos.d/ vim chrome.repo添加如下內容: [google64] …

啟動頁更換圖片后,加載不出來

這個問題,重啟一下手機就可以了,我的就是這么解決的。

R-大數據分析挖掘(5-R基礎回顧)

&#xff08;一&#xff09;R函數 R是一種解析型語言&#xff0c;輸入后可直接獲取結果 函數&#xff08;輸入參數&#xff0c;參數&#xff09; R的函數分為“高級”和“低級函數”     ??高級函數可調用低級函數     ??高級函數稱為泛型函數 ??函數名 <-‐…

jquery點擊label觸發2次的問題

今天寫問卷的時候遇到個label點擊的時候&#xff0c;監聽的click事件被執行兩次&#xff1b;產生這個的原因么。。。事件冒泡 <div class"questionBox checkBox"><div class"title"> 2.你如何理解創新意識的重要性?</div><div class…

git本地項目管理

Git 基本工作流程 | git倉庫 | 暫存區 | 工作目錄 | | ---------------- | ------------------ | ------------------- | | 用于存放提 交記錄 | 臨時存放被修改文件 | 被Git管理的項目目錄 | Git 的使用 1.5.1 Git 使用前配置 在使用 git 前&#xff0c;需要告訴 git 你…

Python中self用法詳解

在介紹Python的self用法之前&#xff0c;先來介紹下Python中的類和實例…… 我們知道&#xff0c;面向對象最重要的概念就是類&#xff08;class&#xff09;和實例&#xff08;instance&#xff09;&#xff0c;類是抽象的模板&#xff0c;比如學生這個抽象的事物&#xff0c;…

siwft初學(一)

今天剛開始學習swift語言。首先須要下載xcode6 beta版本號。正式版本號然后會公布。自己學習總結一下&#xff0c;假設有誤。請大家指出。 創建project的時候。language選擇swift語言。 swift語言比起c&#xff0c;oc很的簡潔。開始真有點不適應&#xff0c;沒有main函數&#…

python簡單爬蟲(一)

學習python前糾結了下&#xff0c;到底是應該一個個知識點吃透&#xff0c;然后寫些小程序。還是應該快速掌握基礎語法&#xff0c;快速實踐。思考后認為前者這么學習速度真心不高&#xff0c;于是花2天時間看了下python3的語法&#xff0c;雖然很多都不明白&#xff0c;但是帶…

Github遠程倉庫管理

1. Github 在版本控制系統中&#xff0c;大約90%的操作都是在本地倉庫中進行的&#xff1a;暫存&#xff0c;提交&#xff0c;查看狀態或者歷史記錄等等。除此之外&#xff0c;如果僅僅只有你一個人在這個項目里工作&#xff0c;你永遠沒有機會需要設置一個遠程倉庫。 只有當…