欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過(guò)示例講解Java有哪些加鎖方式

 更新時(shí)間:2025年06月18日 10:26:00   作者:五道書(shū)童  
在Java中加鎖是一種同步機(jī)制,用于控制對(duì)共享資源的并發(fā)訪問(wèn),以防止多個(gè)線程同時(shí)修改數(shù)據(jù),從而避免數(shù)據(jù)不一致和并發(fā)問(wèn)題,這篇文章主要介紹了Java有哪些加鎖方式的相關(guān)資料,需要的朋友可以參考下

在Java中,加鎖的方式主要有以下幾種:

1. synchronized 關(guān)鍵字

synchronized 是Java中最基本的加鎖機(jī)制,可以用于方法或代碼塊。

  • 實(shí)例方法

    public synchronized void method() {
        // 同步代碼
    }
    

    鎖的是當(dāng)前實(shí)例對(duì)象。

  • 靜態(tài)方法

    public static synchronized void staticMethod() {
        // 同步代碼
    }
    

    鎖的是當(dāng)前類(lèi)的 Class 對(duì)象。

  • 代碼塊

    public void method() {
        synchronized (this) {
            // 同步代碼
        }
    }
    

    鎖的是指定對(duì)象。

2. ReentrantLock

ReentrantLock 是 java.util.concurrent.locks 包中的類(lèi),提供了比 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 是一種讀寫(xiě)鎖,允許多個(gè)讀線程同時(shí)訪問(wèn),但寫(xiě)線程獨(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 {
            // 寫(xiě)操作
        } finally {
            rwLock.writeLock().unlock();
        }
    }
}

4. StampedLock

StampedLock 是Java 8引入的鎖機(jī)制,支持樂(lè)觀讀鎖、悲觀讀鎖和寫(xiě)鎖。

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 {
            // 寫(xiě)操作
        } 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ù)信號(hào)量,用于控制同時(shí)訪問(wèn)特定資源的線程數(shù)量。

import java.util.concurrent.Semaphore;

public class Example {
    private final Semaphore semaphore = new Semaphore(10); // 允許10個(gè)線程同時(shí)訪問(wèn)

    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 類(lèi)

Atomic 類(lèi)(如 AtomicInteger、AtomicReference 等)通過(guò)CAS(Compare-And-Swap)實(shí)現(xiàn)無(wú)鎖同步。

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:簡(jiǎn)單易用,適合大多數(shù)場(chǎng)景。
  • ReentrantLock:提供更多功能,如可中斷鎖、超時(shí)鎖等。
  • ReadWriteLock:適合讀多寫(xiě)少的場(chǎng)景。
  • StampedLock:性能更高,適合復(fù)雜場(chǎng)景。
  • Semaphore:控制資源訪問(wèn)數(shù)量。
  • Condition:用于線程間協(xié)調(diào)。
  • Atomic 類(lèi):無(wú)鎖同步,適合簡(jiǎn)單操作。
  • LockSupport:底層線程阻塞和喚醒工具。

根據(jù)具體需求選擇合適的加鎖方式。

到此這篇關(guān)于Java有哪些加鎖方式的文章就介紹到這了,更多相關(guān)Java加鎖方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort

    Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort,本文直接給出實(shí)例代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
    2015-06-06
  • Netty分布式高性能工具類(lèi)recycler的使用及創(chuàng)建

    Netty分布式高性能工具類(lèi)recycler的使用及創(chuàng)建

    這篇文章主要為大家介紹了Netty分布式高性能工具類(lèi)recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • SpringData如何通過(guò)@Query注解支持JPA語(yǔ)句和原生SQL語(yǔ)句

    SpringData如何通過(guò)@Query注解支持JPA語(yǔ)句和原生SQL語(yǔ)句

    這篇文章主要介紹了SpringData如何通過(guò)@Query注解支持JPA語(yǔ)句和原生SQL語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • maven坐標(biāo)Dependencies和Exclusions的使用

    maven坐標(biāo)Dependencies和Exclusions的使用

    這篇文章主要介紹了maven坐標(biāo)Dependencies和Exclusions的使用,很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解Java高并發(fā)編程之AtomicReference

    詳解Java高并發(fā)編程之AtomicReference

    此篇文章主要介紹了AtomicReference的出現(xiàn)背景,AtomicReference的使用場(chǎng)景,以及介紹了AtomicReference的源碼,重點(diǎn)方法的源碼分析
    2021-06-06
  • Mybatis插件PageHelper的實(shí)現(xiàn)原理詳解

    Mybatis插件PageHelper的實(shí)現(xiàn)原理詳解

    PageHelper 是一款開(kāi)源的 MyBatis 分頁(yè)插件,可以在實(shí)際應(yīng)用中方便地實(shí)現(xiàn)分頁(yè)功能,這篇文章主要來(lái)和大家講講PageHelper的原理與使用,需要的可以參考下
    2023-06-06
  • Spring??AOP的兩種使用方法

    Spring??AOP的兩種使用方法

    這篇文章主要介紹了Spring?AOP的兩種使用方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Java校驗(yàn)validate介紹和使用實(shí)例

    Java校驗(yàn)validate介紹和使用實(shí)例

    這篇文章主要介紹了Java校驗(yàn)validate介紹和使用的相關(guān)資料,還介紹了如何使用@Valid和@Validated注解進(jìn)行聲明式校驗(yàn),以及如何處理復(fù)雜校驗(yàn)需求,通過(guò)自定義校驗(yàn)注解來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2025-01-01
  • java多線程編程實(shí)例

    java多線程編程實(shí)例

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下。
    2017-11-11
  • Springbootadmin與security沖突問(wèn)題及解決

    Springbootadmin與security沖突問(wèn)題及解決

    這篇文章主要介紹了Springbootadmin與security沖突問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論