同步關鍵詞lock

概述

1、API在JDK的java.util.concurrent.locks下。

2、不是Java關鍵字,是接口。

3、ReentrantLock是JDK唯一實現了Lock接口的類。

public interface Lock {//獲取鎖void lock();//可以響應中斷的鎖void lockInterruptibly() throws InterruptedException;//嘗試獲取鎖boolean tryLock();//嘗試獲取鎖,如果拿不到會等待time的時間boolean tryLock(long time, TimeUnit unit) throws InterruptedException;//釋放鎖void unlock();
}

四個獲取鎖方法

lock()

是平常使用得最多的一個方法,就是用來獲取鎖。如果鎖已被其他線程獲取,則進行等待。
由于在前面講到如果采用Lock,必須主動去釋放鎖,并且在發生異常時,不會自動釋放鎖。因此一般來說,使用Lock必須在try{}catch{}塊中進行,并且將釋放鎖的操作放在finally塊中進行,以保證鎖一定被被釋放,防止死鎖的發生。

實例:http://blog.csdn.net/zengmingen/article/details/53257891

tryLock()

是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true,如果獲取失敗(即鎖已被其他線程獲取),則返回false,也就說這個方法無論如何都會立即返回。在拿不到鎖時不會一直在那等待。

實例:http://blog.csdn.net/zengmingen/article/details/53259279

tryLock(long time, TimeUnit unit)

和tryLock()方法是類似的,只不過區別在于這個方法在拿不到鎖時會等待一定的時間,在時間期限之內如果還拿不到鎖,就返回false。如果如果一開始拿到鎖或者在等待期間內拿到了鎖,則返回true。

實例:http://blog.csdn.net/zengmingen/article/details/53259394

lockInterruptibly()

比較特殊,當通過這個方法去獲取鎖時,如果其他線程正在等待獲取鎖,則這個線程能夠響應中斷,即中斷線程的等待狀態。也就使說,當兩個線程同時通過

lockInterruptibly()想獲取某個鎖時,假若此時線程A獲取到了鎖,而線程B只有等待,那么對線程B調用threadB.interrupt()方法能夠中斷線程B的等待過程。

【注意:等待的那個線程B可以被中斷,不是正在執行的A線程被中斷。
注意,當一個線程獲取了鎖之后,是不會被interrupt()方法中斷的。
因此當通過lockInterruptibly()方法獲取某個鎖時,如果不能獲取到,只有進行等待的情況下,是可以響應中斷的。
而用synchronized修飾的話,當一個線程處于等待某個鎖的狀態,是無法被中斷的,只有一直等待下去。】

實例:http://blog.csdn.net/zengmingen/article/details/53260650

Lock和synchronized的選擇

  1)Lock是一個接口,而synchronized是Java中的關鍵字,synchronized是內置的語言實現。
  2)synchronized在發生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現象發生。

而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖。
  3)Lock可以讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷;
  4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。
  5)Lock可以提高多個線程進行讀操作的效率。
  在性能上來說,如果競爭資源不激烈,兩者的性能是差不多的,而當競爭資源非常激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優于synchronized。在具體使用時要根據適當情況選擇。




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

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

相關文章

Java bitset轉string_將java BitSet保存到DB

默認情況下,JPA使用Java序列化來保存未知Serializable類型的屬性(以便將序列化表示存儲為byte []).通常它不是您想要的,因為可以有更有效的方式來表示您的數據.例如,BitSet可以有效地表示為數字(如果它的大小有界),或者byte [],或其他東西(遺憾的是,BitSet不提供進行這些轉換的…

python讀取raw圖片文件_在python下讀取并展示raw格式的圖片實例

raw文件可能有些人沒有,因此,先用一張圖片創建一個raw格式的文件(其實可以是其他類型的格式文件) import numpy as np import cv2 img cv2.imread(cat.jpg) # 這里需要我們在當前目錄下放一張名為cat.jpg的文件 img.tofile(cat.r…

python怎么網絡通信_深入Python中的網絡通信

TCP/IP計算機與網絡設備兩情侶要談戀愛,相互通信,那么雙方就必須有規則。基于相同的方法,不同的硬件、操作系統之間的通信,都需要一種規則。而我們就把這種規則稱為協議(protocol)。TCP/IP 是互聯網相關各類協議族的總稱。TCP/IP是…

ReadWriteLock讀寫文件

概述 ReadWriteLock是一個接口,在它里面只定義了兩個方法:一個讀的鎖和一個寫的鎖。 讀的鎖:A線程獲取了讀的鎖,那么B線程也可以獲取讀的鎖。 寫的鎖:A線程獲取了寫的鎖,那么B線程不能獲取讀也不能獲取寫…

搞懂 Java HashMap 源碼

HashMap 源碼分析 前幾篇分析了 ArrayList , LinkedList ,Vector ,Stack List 集合的源碼,Java 容器除了包含 List 集合外還包含著 Set 和 Map 兩個重要的集合類型。而 HashMap 則是最具有代表性的,也是我們最常使用到…

python 怎么表示sqlserver null_如何使用Python將sqlserver查詢輸出寫入.txt文件?

我是Python新手,嘗試連接到sqlserverdb并將查詢的輸出轉換成一個flat.txt文件。在一些代碼正在工作,但是只寫了將近1000條記錄,然后就停止了。在Python版本:2.7.13。在下面的代碼能夠把100萬條記錄全部寫入csv文件而不是.txt文件&…

python中object是什么類型_Python 的 type 和 object 之間是怎么一種關系?

class,metaclass,instance,subclass,base 以下成立: 對任意的A,A是instance(推論:任意class也是instance) 對任意A,存在B,使得B是A的class A是cla…

java8新生代_jdk8.0的jvm詳情

jstat命令可以查看堆內存各部分的使用量,以及加載類的數量。命令的格式如下:jstat [-命令選項] [vmid] [間隔時間/毫秒] [查詢次數]注意:使用的jdk版本是jdk8.[work16-11-118qf-pms]$ jstat -class 32417Loaded?? Bytes?? Unloaded?? B…

Java中的Runnable、Callable、Future、FutureTask的區別與示例

原文地址:http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------------------------- Java中存在Runnable、Callable、Future、FutureTask這幾個與線程相關的類或者接口,在Java中也是比較重要的幾個概念&am…

sql count為空時顯示0_C0010負坐標顯示為正數+紅色0值參考線

小伙伴們早上好啊!今天繼續為大家分享柱形圖的美化技巧。希望大家認真閱讀Excel文件和教程,有的圖表看起來簡單,實際上在細節處理上用了很多技巧,大家要多多體會。C0010-負坐標顯示為正數紅色0值參考線效果圖圖表概述本圖可以用來…

配置IISExpress允許外部訪問

配置IISExpress允許外部訪問 1.找到IISExpress的配置文件&#xff0c;位于 <文檔>/IISExpress/config文件夾下&#xff0c;打開applicationhost.config&#xff0c;找到如下代碼&#xff1a;<site name"WebSite1" id"1" serverAutoStart"tru…

python布爾測試對象_python布爾類型和邏輯運算

布爾類型 python中True表示真&#xff0c;False表示假&#xff0c;它們是布爾類型&#xff1a;1 2>>> type(True) 在python中&#xff0c;bool的True和False是數值1和0的字符串表示格式&#xff0c;實際上bool類型是int類型的一個子類。1 2>>> bool.__bases_…

mac預裝的php路徑,Mac使用系統自帶php和Apache

最美的語言本文將介紹在Mac環境下如何使用系統本身所帶有的Apache(阿帕奇服務器)通過預裝的PHP版本來運行PHP的相關代碼&#xff0c;相對來講在OS X系統下相對好配置一些&#xff0c;因為Apache和PHP都預裝好了&#xff0c;如果是Windows環境我們需要自己安裝ApachePHPMysql(通…

線程池與Callable更配哦

概述 Callable介紹見&#xff1a;http://blog.csdn.net/zengmingen/article/details/53288119 多線程介紹見&#xff1a;http://blog.csdn.net/zengmingen/article/details/53284999 代碼 TaskCallable.javapackage multithreading.pool;import java.util.concurrent.Callabl…

IP編址,IP地址介紹與子網劃分方法

網絡層位于數據鏈路層與傳輸層之間。網絡層中包含了許多協議&#xff0c;其中最為重要的協議就是IP協議。網絡層提供了IP路由功能。理解IP路由除了要熟悉IP協議的工作機制之外&#xff0c;還必須理解IP編址以及如何合理地使用IP地址來設計網絡。 上層協議類型 以太網幀中的Typ…

3- OpenCV+TensorFlow 入門人工智能圖像處理-TensorFlow入門

tensorflow基礎入門 思考一個問題: 如何剛好學習TensorFlow 類比為一門開發語言&#xff0c;學會語法&#xff0c;api的調用&#xff0c; 原理性掌握。語言的要素: 基礎數據類型 運算符 流程 字典 數組 import tensorflow as tf# 常量&#xff0c;指定數據類型 data1 tf.const…

r 函數返回多個值_第四講 R描述性統計分析

在“R與生物統計專題”中&#xff0c;我們會從介紹R的基本知識展開到生物統計原理及其在R中的實現。以從淺入深&#xff0c;層層遞進的形式在投必得醫學公眾號更新。在上一講中&#xff0c;我們介紹了第三講 R編程基礎-矩陣和數據框 (戳這里即可跳轉)。到現在為止&#xff0c;大…

python雙線性插值函數_雙線性插值法原理 python實現

碼字不易&#xff0c;如果此文對你有所幫助&#xff0c;請幫忙點贊&#xff0c;感謝&#xff01;一. 雙線性插值法原理&#xff1a;① 何為線性插值&#xff1f;插值就是在兩個數之間插入一個數&#xff0c;線性插值原理圖如下&#xff1a;在位置 x 進行線性插值&#xff0c;插…

張恩民 php,php100教程_php100張恩民php視頻 56課時_網站編程_寂涯網絡學習基地

1、PHP基本語法和數據類型&#xff1a;(1)、PHP基本語法&#xff1a;1、htm 和 php 混編2、一個語句以 ; (分號結束)3、如何定義一個變量&#xff0c;和變量的使用(2)、PHP數據運算類型四種標量類型&#xff1a;boolean(布爾型)integer(整型)float(浮點型&#xff0c;也作“do…

Oracle 自帶sqldeveloper導入數據到表

步驟 1、建一張字段名和類型與要導入數據一致的表。 2、如果是excel文件&#xff0c;另存為 csv文件。 因為excel文件遇到空格會報錯&#xff0c;excel文件太大工具會讀取文件失敗。 而csv文件是秒級讀取&#xff0c;有空格也會導入不會報錯。 ------------- 更多的Java&am…