java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java加锁方式

通过示例讲解Java有哪些加锁方式

作者:五道书童

在Java中加锁是一种同步机制,用于控制对共享资源的并发访问,以防止多个线程同时修改数据,从而避免数据不一致和并发问题,这篇文章主要介绍了Java有哪些加锁方式的相关资料,需要的朋友可以参考下

在Java中,加锁的方式主要有以下几种:

1. synchronized 关键字

synchronized 是Java中最基本的加锁机制,可以用于方法或代码块。

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 是一种计数信号量,用于控制同时访问特定资源的线程数量。

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 配合使用,用于线程间的协调。

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 类(如 AtomicIntegerAtomicReference 等)通过CAS(Compare-And-Swap)实现无锁同步。

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();  // 阻塞当前线程
    }

    public void unparkMethod(Thread thread) {
        LockSupport.unpark(thread);  // 唤醒指定线程
    }
}

总结

根据具体需求选择合适的加锁方式。

到此这篇关于Java有哪些加锁方式的文章就介绍到这了,更多相关Java加锁方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文