java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java并发锁

java并发锁的实现

作者:Flying_Fish_roe

Java中的锁主要是为了解决多个线程访问共享数据时的竞争问题,确保线程能够安全地访问和修改共享数据,本文主要介绍了java并发锁的实现,感兴趣的可以了解一下

ReentrantLock 

ReentrantLock是Java并发编程中的一种锁机制。它的基本流程如下:

ReentrantLock的特点和用法如下:

以下是一个使用ReentrantLock的Java代码示例:

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private static ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
        // 创建并启动多个线程
        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(new MyThread());
            thread.start();
        }
    }

    static class MyThread implements Runnable {
        @Override
        public void run() {
            try {
                // 加锁
                lock.lock();
                // 执行需要加锁的代码
                System.out.println("Thread " + Thread.currentThread().getId() + " is running");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 释放锁
                lock.unlock();
            }
        }
    }
}

在上述示例中,我们创建了一个ReentrantLock对象,并在MyThread的run()方法中加锁、执行代码、释放锁。在main方法中,我们创建并启动了5个线程,它们会依次获取锁并执行代码。由于ReentrantLock是可重入锁,同一个线程可以多次获取锁,所以每个线程都可以成功地执行代码块。

ReentrantReadWriteLock

ReentrantReadWriteLock是Java并发编程中的一个锁机制,它是一种读写锁,允许多个线程同时读共享资源,但只能有一个线程写资源。ReentrantReadWriteLock在实现上通过两个锁来实现,一个是读锁(共享锁),一个是写锁(独占锁)。

基本流程如下:

ReentrantReadWriteLock的特点和用法:

下面是一个简单的示例代码,展示了ReentrantReadWriteLock的用法:

import java.util.concurrent.locks.ReentrantReadWriteLock;

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

    public int getValue() {
        lock.readLock().lock(); // 获取读锁
        try {
            return value;
        } finally {
            lock.readLock().unlock(); // 释放读锁
        }
    }

    public void increment() {
        lock.writeLock().lock(); // 获取写锁
        try {
            value++;
        } finally {
            lock.writeLock().unlock(); // 释放写锁
        }
    }
}

在上面的示例中,MyReadWriteLock类包含一个value变量和一个ReentrantReadWriteLock对象。getValue()方法获取读锁,读取value的值并返回。increment()方法获取写锁,将value加1。通过使用读写锁,多个线程可以同时读取value的值,但只有一个线程可以写入value的值。

Condition

Condition是Java并发编程中的一种同步机制,它可以用于实现线程之间的等待和通知。

基本流程:

特点和用法:

示例代码:

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

public class ConditionExample {
    private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();
    private boolean flag = false;

    public void waitForFlag() throws InterruptedException {
        lock.lock();
        try {
            while (!flag) {
                condition.await(); // 线程等待并释放锁
            }
        } finally {
            lock.unlock();
        }
        System.out.println("Flag is true, continue executing.");
    }

    public void setFlag() {
        lock.lock();
        try {
            flag = true;
            condition.signalAll(); // 发送通知并唤醒等待线程
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        final ConditionExample example = new ConditionExample();

        Thread waitingThread = new Thread(() -> {
            try {
                example.waitForFlag();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread settingThread = new Thread(() -> {
            try {
                Thread.sleep(2000); // 模拟执行耗时操作
                example.setFlag();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        waitingThread.start();
        settingThread.start();

        waitingThread.join();
        settingThread.join();
    }
}

在上述示例中,有两个线程,一个线程等待flag变量为true,另一个线程在某一时刻将flag设置为true。通过Condition对象的await()方法使等待线程进入等待状态,并释放锁,直到另一个线程通过Condition对象的signalAll()方法发送通知并唤醒等待线程,等待线程再次获取锁并继续执行。

应用场景

不同的锁机制应对的问题不同,在使用时需要根据具体的应用场景进行选择。

总结 

Java并发体系中的锁是用来管理多个线程对共享资源的访问的工具。锁的使用可以确保多个线程之间的同步和互斥,从而避免竞态条件和数据的不一致性。

Java中的锁可以分为两大类:内置锁和显式锁。

内置锁:

显式锁:

锁的选择应根据具体的需求和场景来决定。synchronized是最简单和常用的锁机制,适用于大部分情况。ReentrantLock提供了更多的灵活性和高级功能,例如可中断锁、公平锁等,但使用起来相对复杂一些。在多个线程需要等待某个条件满足时,使用Condition接口可以更好地控制线程的等待和唤醒。

到此这篇关于java并发锁的实现的文章就介绍到这了,更多相关java并发锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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