java中同步锁的原理和实现
接口 Lock
實(shí)現(xiàn)提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。此實(shí)現(xiàn)允許更靈活的結(jié)構(gòu),可以具有差別很大的屬性,可以支持多個(gè)相關(guān)的 Condition 對(duì)象。鎖是控制多個(gè)線程對(duì)共享資源進(jìn)行訪問的工具。通常,鎖提供了對(duì)共享資源的獨(dú)占訪問。一次只能有一個(gè)線程獲得鎖,對(duì)共享資源的所有訪問都需要首先獲得鎖。不過,某些鎖可能允許對(duì)共享資源并發(fā)訪問,如 ReadWriteLock 的讀取鎖。
語法:
Lock l = ...; l.lock();try {// access the resource protected by this lock} finally {l.unlock();}類 ReentrantLock
ReentrantLock 將由最近成功獲得鎖,并且還沒有釋放該鎖的線程所擁有。當(dāng)鎖沒有被另一個(gè)線程所擁有時(shí),調(diào)用 lock 的線程將成功獲取該鎖并返回。如果當(dāng)前線程已經(jīng)擁有該鎖,此方法將立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法來檢查此情況是否發(fā)生。
此類的構(gòu)造方法接受一個(gè)可選的公平 參數(shù)。當(dāng)設(shè)置為 true 時(shí),在多個(gè)線程的爭(zhēng)用下,這些鎖傾向于將訪問權(quán)授予等待時(shí)間最長(zhǎng)的線程。否則此鎖將無法保證任何特定訪問順序。與采用默認(rèn)設(shè)置(使用不公平鎖)相比,使用公平鎖的程序在許多線程訪問時(shí)表現(xiàn)為很低的總體吞吐量(即速度很慢,常常極其慢),但是在獲得鎖和保證鎖分配的均衡性時(shí)差異較小。不過要注意的是,公平鎖不能保證線程調(diào)度的公平性。因此,使用公平鎖的眾多線程中的一員可能獲得多倍的成功機(jī)會(huì),這種情況發(fā)生在其他活動(dòng)線程沒有被處理并且目前并未持有鎖時(shí)。還要注意的是,未定時(shí)的 tryLock 方法并沒有使用公平設(shè)置。因?yàn)榧词蛊渌€程正在等待,只要該鎖是可用的,此方法就可以獲得成功。?
語法: class X {private final ReentrantLock lock = new ReentrantLock();// ...public void m() { lock.lock(); // block until condition holdstry {// ... method body} finally {lock.unlock()}}}
同步鎖的實(shí)現(xiàn)方法案例: package com.test;import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;class A implements Runnable {private int Ticket = 10;//注意聲明在類中Lock lock = new ReentrantLock();//注意聲明在類中public void func() {lock.lock();//獲取鎖try{while (Ticket > 0) {System.out.println(Thread.currentThread().getName() + Ticket);Thread.sleep(10);Ticket--;}} catch (InterruptedException e) {e.printStackTrace();}finally{lock.unlock();//開鎖}}@Overridepublic void run() {func();/*用同步鎖時(shí)候需要把方法獨(dú)立出來*/} }public class test1 {public static void main(String[] args) {A a = new A();new Thread(a, "A").start();new Thread(a, "B").start();new Thread(a, "C").start();new Thread(a, "D").start();} }
總結(jié)
以上是生活随笔為你收集整理的java中同步锁的原理和实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: html中怎样实现在输入框中出现提示
- 下一篇: Unity3d--跨平台(一)
