JAVA的读写锁

本文介绍了Java中的读写锁机制,重点讲解了ReentrantReadWriteLock的使用。通过示例展示了如何在并发环境中实现对共享资源的安全读写操作,强调了读锁和写锁的互斥性以及读锁的共享特性,同时指出可重入锁的概念,以提高并发性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道锁分共享锁和排他锁,实际使用中我们一般将锁机制分为读和写两种场景,即我们期望写入排他,读取共享。Java由此提供了包转后的读写锁工具类。

//创建对象
 ReadWriteLock readWriteLock=new ReentrantReadWriteLock();
 //创建写锁
 readWriteLock.writeLock().lock();
 //解锁
 readWriteLock.writeLock().unlock();
 //创建读锁
 readWriteLock.readLock().lock();

特点

  1. 读锁可以访问,操作资源,而写锁将阻塞其他线程
  2. 加入读锁无法加锁
  3. 并发性更好
  4. 可重入
    ps :可重入锁是指该线程a获取锁,可重新申请获取锁
    重入锁的介绍
package day2.读写锁;

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

public class Book {
    private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();

    int num=10;
    void buy() throws InterruptedException {
        readWriteLock.writeLock().lock();
        System.out.println("正在清算 购入图书"+Thread.currentThread().getName()+" 当前 "+num);
        TimeUnit.SECONDS.sleep(3);
        num = num +1;
        readWriteLock.writeLock().unlock();


    }
    void find(){
        readWriteLock.readLock().lock();

        System.out.println("查看当前图书"+Thread.currentThread().getName()+"当前   "+num);
        readWriteLock.readLock().unlock();


    }
    void sale() throws InterruptedException {
        readWriteLock.writeLock().lock();
        System.out.println("当前可售卖图书  "+Thread.currentThread().getName()+" 当前  "+num);
        if(num>=1){
        num = num -1;}
        readWriteLock.writeLock().unlock();


    }


}

package day2.读写锁;

import java.util.concurrent.TimeUnit;

public class test {



    public static void main(String args[]) throws InterruptedException {
        Book book=new Book();

        new Thread(()->{
            for(int i=0;i<=100;i++){
            book.find();}
        }).start();
        new Thread(()->{
            while(true){
                try {
                    book.find();
                    book.sale();
                    //TimeUnit.SECONDS.sleep(1);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        new Thread(()->{
            while(true){
                try {
                    book.find();
                    book.buy();
                   // TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        new Thread(()->{
            while(true){
                try {
                    book.find();
                    book.buy();
                   // TimeUnit.MILLISECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();




}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值