通過示例講解Java有哪些加鎖方式
在Java中,加鎖的方式主要有以下幾種:
1. synchronized 關(guān)鍵字
synchronized
是Java中最基本的加鎖機(jī)制,可以用于方法或代碼塊。
實(shí)例方法:
public synchronized void method() { // 同步代碼 }
鎖的是當(dāng)前實(shí)例對象。
靜態(tài)方法:
public static synchronized void staticMethod() { // 同步代碼 }
鎖的是當(dāng)前類的
Class
對象。代碼塊:
public void method() { synchronized (this) { // 同步代碼 } }
鎖的是指定對象。
2. ReentrantLock
ReentrantLock
是 java.util.concurrent.locks
包中的類,提供了比 synchronized
更靈活的鎖機(jī)制。
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Example { private final Lock lock = new ReentrantLock(); public void method() { lock.lock(); // 加鎖 try { // 同步代碼 } finally { lock.unlock(); // 釋放鎖 } } }
3. ReadWriteLock
ReadWriteLock
是一種讀寫鎖,允許多個讀線程同時訪問,但寫線程獨(dú)占鎖。
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Example { private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); public void readMethod() { rwLock.readLock().lock(); try { // 讀操作 } finally { rwLock.readLock().unlock(); } } public void writeMethod() { rwLock.writeLock().lock(); try { // 寫操作 } finally { rwLock.writeLock().unlock(); } } }
4. StampedLock
StampedLock
是Java 8引入的鎖機(jī)制,支持樂觀讀鎖、悲觀讀鎖和寫鎖。
import java.util.concurrent.locks.StampedLock; public class Example { private final StampedLock stampedLock = new StampedLock(); public void readMethod() { long stamp = stampedLock.readLock(); try { // 讀操作 } finally { stampedLock.unlockRead(stamp); } } public void writeMethod() { long stamp = stampedLock.writeLock(); try { // 寫操作 } finally { stampedLock.unlockWrite(stamp); } } public void optimisticReadMethod() { long stamp = stampedLock.tryOptimisticRead(); // 讀操作 if (!stampedLock.validate(stamp)) { stamp = stampedLock.readLock(); try { // 重新讀操作 } finally { stampedLock.unlockRead(stamp); } } } }
5. Semaphore
Semaphore
是一種計(jì)數(shù)信號量,用于控制同時訪問特定資源的線程數(shù)量。
import java.util.concurrent.Semaphore; public class Example { private final Semaphore semaphore = new Semaphore(10); // 允許10個線程同時訪問 public void method() throws InterruptedException { semaphore.acquire(); // 獲取許可 try { // 同步代碼 } finally { semaphore.release(); // 釋放許可 } } }
6. Condition
Condition
通常與 ReentrantLock
配合使用,用于線程間的協(xié)調(diào)。
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Example { private final Lock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); public void awaitMethod() throws InterruptedException { lock.lock(); try { condition.await(); // 等待 } finally { lock.unlock(); } } public void signalMethod() { lock.lock(); try { condition.signal(); // 喚醒 } finally { lock.unlock(); } } }
7. Atomic 類
Atomic
類(如 AtomicInteger
、AtomicReference
等)通過CAS(Compare-And-Swap)實(shí)現(xiàn)無鎖同步。
import java.util.concurrent.atomic.AtomicInteger; public class Example { private final AtomicInteger atomicInteger = new AtomicInteger(0); public void increment() { atomicInteger.incrementAndGet(); // 原子操作 } }
8. LockSupport
LockSupport
提供了線程阻塞和喚醒的基本操作。
import java.util.concurrent.locks.LockSupport; public class Example { public void parkMethod() { LockSupport.park(); // 阻塞當(dāng)前線程 } public void unparkMethod(Thread thread) { LockSupport.unpark(thread); // 喚醒指定線程 } }
總結(jié)
synchronized
:簡單易用,適合大多數(shù)場景。ReentrantLock
:提供更多功能,如可中斷鎖、超時鎖等。ReadWriteLock
:適合讀多寫少的場景。StampedLock
:性能更高,適合復(fù)雜場景。Semaphore
:控制資源訪問數(shù)量。Condition
:用于線程間協(xié)調(diào)。Atomic
類:無鎖同步,適合簡單操作。LockSupport
:底層線程阻塞和喚醒工具。
根據(jù)具體需求選擇合適的加鎖方式。
到此這篇關(guān)于Java有哪些加鎖方式的文章就介紹到這了,更多相關(guān)Java加鎖方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort,本文直接給出實(shí)例代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06Netty分布式高性能工具類recycler的使用及創(chuàng)建
這篇文章主要為大家介紹了Netty分布式高性能工具類recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03SpringData如何通過@Query注解支持JPA語句和原生SQL語句
這篇文章主要介紹了SpringData如何通過@Query注解支持JPA語句和原生SQL語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11maven坐標(biāo)Dependencies和Exclusions的使用
這篇文章主要介紹了maven坐標(biāo)Dependencies和Exclusions的使用,很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12詳解Java高并發(fā)編程之AtomicReference
此篇文章主要介紹了AtomicReference的出現(xiàn)背景,AtomicReference的使用場景,以及介紹了AtomicReference的源碼,重點(diǎn)方法的源碼分析2021-06-06Mybatis插件PageHelper的實(shí)現(xiàn)原理詳解
PageHelper 是一款開源的 MyBatis 分頁插件,可以在實(shí)際應(yīng)用中方便地實(shí)現(xiàn)分頁功能,這篇文章主要來和大家講講PageHelper的原理與使用,需要的可以參考下2023-06-06Java校驗(yàn)validate介紹和使用實(shí)例
這篇文章主要介紹了Java校驗(yàn)validate介紹和使用的相關(guān)資料,還介紹了如何使用@Valid和@Validated注解進(jìn)行聲明式校驗(yàn),以及如何處理復(fù)雜校驗(yàn)需求,通過自定義校驗(yàn)注解來實(shí)現(xiàn),需要的朋友可以參考下2025-01-01Springbootadmin與security沖突問題及解決
這篇文章主要介紹了Springbootadmin與security沖突問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08