通過示例講解Java有哪些加鎖方式
在Java中,加鎖的方式主要有以下幾種:
1. synchronized 關(guān)鍵字
synchronized 是Java中最基本的加鎖機制,可以用于方法或代碼塊。
實例方法:
public synchronized void method() { // 同步代碼 }鎖的是當(dāng)前實例對象。
靜態(tài)方法:
public static synchronized void staticMethod() { // 同步代碼 }鎖的是當(dāng)前類的
Class對象。代碼塊:
public void method() { synchronized (this) { // 同步代碼 } }鎖的是指定對象。
2. ReentrantLock
ReentrantLock 是 java.util.concurrent.locks 包中的類,提供了比 synchronized 更靈活的鎖機制。
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 是一種讀寫鎖,允許多個讀線程同時訪問,但寫線程獨占鎖。
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引入的鎖機制,支持樂觀讀鎖、悲觀讀鎖和寫鎖。
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 是一種計數(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)實現(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)及算法實例:插入排序 Insertion Sort
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實例:插入排序 Insertion Sort,本文直接給出實例代碼,代碼中包含詳細注釋,需要的朋友可以參考下2015-06-06
Netty分布式高性能工具類recycler的使用及創(chuàng)建
這篇文章主要為大家介紹了Netty分布式高性能工具類recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03
SpringData如何通過@Query注解支持JPA語句和原生SQL語句
這篇文章主要介紹了SpringData如何通過@Query注解支持JPA語句和原生SQL語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
maven坐標(biāo)Dependencies和Exclusions的使用
這篇文章主要介紹了maven坐標(biāo)Dependencies和Exclusions的使用,很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
詳解Java高并發(fā)編程之AtomicReference
此篇文章主要介紹了AtomicReference的出現(xiàn)背景,AtomicReference的使用場景,以及介紹了AtomicReference的源碼,重點方法的源碼分析2021-06-06
Mybatis插件PageHelper的實現(xiàn)原理詳解
PageHelper 是一款開源的 MyBatis 分頁插件,可以在實際應(yīng)用中方便地實現(xiàn)分頁功能,這篇文章主要來和大家講講PageHelper的原理與使用,需要的可以參考下2023-06-06
Springbootadmin與security沖突問題及解決
這篇文章主要介紹了Springbootadmin與security沖突問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08

