Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java 几种锁


在 Java 中,有多种锁的实现方式来实现并发控制,这些锁提供了不同的特性和适用场景。下面我将介绍几种常见的锁实现方式,并提供相关的示例代码和依赖坐标。

synchronized 关键字

synchronized 是 Java 中最基本的同步机制,可以用于方法或代码块。它基于对象监视器(或称为内部锁)来实现线程同步。

步骤流程:

  1. 当线程想要执行 synchronized 块或方法时,它会尝试获取对象的锁。
  2. 如果锁没有被其他线程持有,该线程会获得锁并执行代码块或方法。
  3. 当线程完成操作后,会释放锁,其他等待的线程可以获得锁。

示例代码:

public class SynchronizedExample {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public static void main(String[] args) {
        SynchronizedExample example = new SynchronizedExample();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                example.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                example.increment();
            }
        });

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Count: " + example.count);
    }
}

ReentrantLock

ReentrantLock 是 java.util.concurrent 包中提供的锁实现,它提供了比 synchronized 更多的灵活性和扩展性,例如可重入性、公平性等。

依赖坐标: Maven:

<dependency>
    <groupId>org.codehaus.jsr166</groupId>
    <artifactId>java.util.concurrent</artifactId>
    <version>1.8.0</version>
</dependency>

Gradle:

implementation 'org.codehaus.jsr166:java.util.concurrent:1.8.0'

步骤流程:

  1. 创建 ReentrantLock 实例。
  2. 在需要同步的代码块中,使用 lock() 方法获取锁。
  3. 执行代码块。
  4. 使用 unlock() 方法释放锁。

示例代码:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private int count = 0;
    private Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ReentrantLockExample example = new ReentrantLockExample();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                example.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                example.increment();
            }
        });

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Count: " + example.count);
    }
}

ReadWriteLock

ReadWriteLock 也是 java.util.concurrent 包中的一种锁实现,它区分了读操作和写操作,提高了并发读的效率。

依赖坐标: Maven:

<dependency>
    <groupId>org.codehaus.jsr166</groupId>
    <artifactId>java.util.concurrent</artifactId>
    <version>1.8.0</version>
</dependency>

Gradle:

implementation 'org.codehaus.jsr166:java.util.concurrent:1.8.0'

步骤流程:

  1. 创建 ReadWriteLock 实例。
  2. 调用 readLock() 方法获取读锁,多个线程可以同时持有读锁。
  3. 调用 writeLock() 方法获取写锁,只有一个线程可以持有写锁,且在持有写锁期间,其他线程无法获取读锁或写锁。
  4. 执行读操作或写操作。
  5. 释放锁。

示例代码:

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockExample {
    private int value = 0;
    private ReadWriteLock lock = new ReentrantReadWriteLock();

    public int readValue() {
        lock.readLock().lock();
        try {
            return value;
        } finally {
            lock.readLock().unlock();
        }
    }

    public void writeValue(int newValue) {
        lock.writeLock().lock();
        try {
            value = newValue;
        } finally {
            lock.writeLock().unlock();
        }
    }

    public static void main(String[] args) {
        ReadWriteLockExample example = new ReadWriteLockExample();

        Thread readerThread = new Thread(() -> {
            int val = example.readValue();
            System.out.println("Read value: " + val);
        });

        Thread writerThread = new Thread(() -> {
            example.writeValue(42);
            System.out.println("Value written.");
        });

        readerThread.start();
        writerThread.start();

        try {
            readerThread.join();
            writerThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

以上是几种常见的 Java 锁实现方式及其使用示例。每种锁机制都适用于不同的场景,你可以根据具体需求选择适合的锁来实现并发控制。

在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。锁旨在强制实施互斥排他、 ...
在Java中实现Redis分布式锁有多种方式,我将为你介绍其中一些常见的方法,包括步骤流程和示例代码,并提供相应的Maven和Gradle依 ...
Java提供了多种不同类型的List实现,其中一些常见的包括:###ArrayList*步骤流程:1.创建一个`ArrayList`对象,通 ...
在Java中实现Redis分布式锁有多种方式,下面将介绍三种常见的实现方式,包括步骤流程、代码示例以及依赖坐标。示例代码如下:###方式三: ...
在Java中,有多种实现了Map接口的数据结构,每种数据结构都有其特定的用途和性能特点。示例代码:Maven依赖坐标:Gradle依赖坐标: ...