首页 > 编程语言 >Java中锁的使用

Java中锁的使用

时间:2023-06-13 10:00:56浏览次数:36  
标签:Java synchronized lock ReentrantLock 使用 Semaphore 中锁 public

目录

Java提供了多种锁机制来实现多线程同步和互斥。

这些锁机制包括synchronized关键字、ReentrantLock【锐安屯】、ReentrantReadWriteLock、Semaphore【C莫法儿】、CountDownLatch等。下面分别介绍这些锁机制的使用方法:

synchronized关键字
  1. synchronized是Java中最简单的锁机制,它可以用来实现方法或者代码块的同步。synchronized关键字的使用方式有两种
    • 一种是在方法声明中使用,另一种是在代码块中使用。
    • 在方法声明中使用synchronized关键字:
public synchronized void method() {
    // 方法体
}
  1. 在代码块中使用synchronized关键字:其中,lock是一个共享的对象,synchronized关键字会对object进行加锁,在临界区代码执行期间,其他线程无法访问object。
public class SynchronizedExample {
    public void doSomething(Object lock) {
        synchronized (lock) {
            // 临界区
        }
    }
}

ReentrantLock
  1. ReentrantLock是Java中一个可重入的互斥锁,它提供了比synchronized更加灵活的同步方式。使用ReentrantLock需要先创建一个ReentrantLock对象,然后使用lock()方法获得锁,在finally块中使用unlock()方法释放锁。
private final ReentrantLock lock = new ReentrantLock();

public void method() {
    lock.lock();
    try {
        // 临界区
    } finally {
        lock.unlock();
    }
}

ReentrantReadWriteLock
  1. ReentrantReadWriteLock是Java中一个可重入的读写锁,它提供了比ReentrantLock更加高效的读写操作。使用ReentrantReadWriteLock需要先创建一个ReentrantReadWriteLock对象,然后使用readLock()方法获得读锁,使用writeLock()方法获得写锁,在finally块中使用unlock()方法释放锁。
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

public void readMethod() {
    lock.readLock().lock();
    try {
        // 读操作
    } finally {
        lock.readLock().unlock();
    }
}

public void writeMethod() {
    lock.writeLock().lock();
    try {
        // 写操作
    } finally {
        lock.writeLock().unlock();
    }
}

Semaphore
  1. Semaphore是Java中一个计数信号量,它可以用来控制对某个共享资源的访问。Semaphore有一个初始的计数值,每次使用Semaphore时,计数值会减一,当计数值为0时,其他线程将无法访问共享资源。
private final Semaphore semaphore = new Semaphore(10);

public void method() throws InterruptedException {
    semaphore.acquire(); // 获取信号量
    try {
        // 访问共享资源
    } finally {
        semaphore.release(); // 释放信号量
    }
}

CountDownLatch
  1. CountDownLatch是Java中一个同步辅助类,它可以用来等待一组线程执行完毕再继续执行。CountDownLatch有一个初始的计数值,每次调用countDown()方法时,计数值会减一,当计数值为0时,等待线程将被释放。
private final CountDownLatch latch = new CountDownLatch(10);

public void method() throws InterruptedException {
    for (int i = 0; i < 10; i++) {
        new Thread(() -> {
            // 执行任务
            latch.countDown(); // 计数器减一
        }).start();
    }
    latch.await(); // 等待计数器归零
    // 所有任务执行完毕
}
以上是Java中常用的锁机制,不同的锁机制适用于不同的场景。在使用锁时,需要注意避免死锁、饥饿等问题,保证程序的正确性和效率。

标签:Java,synchronized,lock,ReentrantLock,使用,Semaphore,中锁,public
From: https://www.cnblogs.com/Twittery/p/17476696.html

相关文章

  • JAVA非递归生成无限级菜单树的较简代码实现。(非泛用型工具包,仅总结逻辑)
    这是一个根据列表生成一个树状结构的较简单实现。搜了搜看起来好像没多少人总结过这种实现。写上来整理一下自己的思路,请大家用用看看,应该用起来问题不大?反正我没遇到BUG。实现的时间复杂度为O(N),空间复杂度应该还是O(N)吧。不过GPT说O(1)可能是因为java的对象实现hash链表是引用而不是......
  • Visualvm使用
    1.安装只要安装JDK即可,运行jvisualvm.exe,选择【工具】——【插件】——【可用插件】  ·2使用2.1.远程机器设置要从远程应用程序中检索数据,需要在远程JVM上运行jstatd实用程序。即要进行以下操作:1)在jdk安装目录的bin目录下新建文件jstatd.all.policy,文件内容为:g......
  • 使用pymongo重命名集合字段
    背景根据mongo规范,需要将多个库的多个集合中的所有驼峰字段名称全部改为下划线分割的。如果使用mongo命令重命名集合字段,处理起来比较麻烦:表结构的形式比较多:比如嵌套子文档、嵌套列表文档等有些集合的字段不固定有些集合的字段较多多个库的多个集合,需要执行多次所以可以......
  • Java的泛型
    泛型是我们需要的程序设计手段。使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。至少在表面上看来,泛型很像C++中的模板。与Java—样,在C++中,模板也是最先被添加到语言中支持强类型集合的。但是,多年之后人......
  • Java 实战介绍 Cookie 和 Session 的区别
    HTTP是一种不保存状态的协议,即无状态协议,HTTP协议不会保存请求和响应之间的通信状态,协议对于发送过的请求和响应都不会做持久化处理。无状态协议减少了对服务压力,如果一个服务器需要处理百万级用户的请求状态,对服务器的压力无疑的是巨大的。无状态的HTTP由于其简单和易用性......
  • axios-使用axios发起基本的GET请求
    axios是一个专注于网络请求的库!<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> </head> <body> <scriptsrc="lib/axios.js"></script> <script> //1.调......
  • 使用 ChatGPT 创建 APP 的最佳实践
     ​关注文章下方公众号,可免费获取AIGC最新学习资料导读:如果你想用用ChatGPT创建应用程序来赚钱,这是你需要知道的。本文字数:2900,阅读时长大约:18分钟如果你想用ChatGPT创建应用程序来赚钱,这是你需要知道的。 我最好先说出坏消息。如果你认为可以两手一摊,就让ChatGPT为你编......
  • python 中使用zip实现矩阵转置
     001、[root@PC1test04]#lsa.txttest.py[root@PC1test04]#cata.txt##测试数据010203040506070809101112131415161718192021222324252627282930[root@PC1test04]#cattest.py##测试程序#!/usr/bin/envpython#-*......
  • 三星s7fe使用体验
    我直接给一个评价吧,这就是最适合学习的一个平板屏幕这个平板最大的特点就是它的屏幕屏幕是12.4寸的LCD,60hz看着参数可能很一般但是对于平板来说,12.4英寸已经是比较大的存在了普通的平板也就11寸左右,这个直接大了一圈巨大的屏幕对于学习来说是利好,可以不用抠抠搜搜的分......
  • java实现一个接口多个实现类,并且依次调用指定方法
    接口packagecn.daenx.yhchatsdk.mytest;publicinterfaceMyInterface{/***返回-1,后面的实现类将不再执行*返回0,后面的实现类继续执行**@return*/IntegerdoSomething();}实现类实现类1packagecn.daenx.yhchatsdk.mytest;......