首页 > 其他分享 >初识同步锁

初识同步锁

时间:2023-06-11 10:33:54浏览次数:24  
标签:同步 synchronized lock 读锁 初识 线程 Lock static


初识同步锁_读锁

我们知道,锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源,在Lock接口出现之前,Java应用程序只能依靠synchronized关键字来实现同步锁的功能,在java5以后,增加了JUC

的并发包且提供了Lock接口用来实现锁的功能,它提供了与synchroinzed关键字类似的同步功能,只是它比synchronized更灵活,能够显示的获取和释放锁。

Lock的初步使用

Lock是一个接口

初识同步锁_System_02

两个核心的方法lock和unlock。有6个实现类

初识同步锁_System_03

ReentrantLock

重入锁,表示支持重新进入的锁,也就是说,如果当前线程t1通过调用lock方法获取了锁之后,再次调用lock,是不会再阻塞去获取锁的,直接增加重试次数就行了。

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

/**
 * @auther: tianweichang
 * @date: 2018/9/5 06
 * @Description:
 */
public class AtomicDemo {
private static int count=0;

    static Lock lock=new ReentrantLock();
    private static void inc(){
lock.lock();
        try {
            Thread.sleep(1);
            System.out.println(count);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
count++;
        lock.unlock();
    }

public static void main(String[] args) {
for (int i=0;i<1000;i++){
new Thread(()->{AtomicDemo.inc();}).start();
        }
try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("count="+count);
    }
}

ReentrantReadWriteLock

我们以前理解的锁,基本都是排他锁,也就是这些锁在同一时刻只允许一个线程进行访问,而读写所在同一时刻可以允许多个线程访问,但是在写线程访问时,所有的读线程和其他写线程都会被阻塞。读写锁维护了一对锁,一个读锁、一个写锁; 一般情况下,读写锁的性能都会比排它锁好,因为大多数场景读是多于写的。在读多于写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @auther: tianweichang
 * @date: 2018/9/5 06
 * @Description:
 */
public class LockDemo {
static Map<String, Object> cacheMap = new HashMap<>();
    static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    static Lock read = rwl.readLock();//读锁
    static Lock write = rwl.writeLock();//写锁

    public static final Object get(String key) {
        System.out.println("开始读取数据");
        read.lock(); //读锁
        try {
return cacheMap.get(key);
        } finally {
read.unlock();
        }
    }

public static final Object put(String key, Object value) {
write.lock();
        System.out.println("开始写数据");
        try {
return cacheMap.put(key, value);
        } finally {
write.unlock();
        }
    }
}

在这个案例中,通过hashmap来模拟了一个内存缓存,然后使用读写所来保证这个内存缓存的线程安全性。当执行读操作的时候,需要获取读锁,在并发访问的时候,读锁不会被阻塞,因为读操作不会影响执行结果。在执行写操作是,线程必须要获取写锁,当已经有线程持有写锁的情况下,当前线程会被阻塞,只有当写锁释放以后,其他读写操作才能继续执行。使用读写锁提升读操作的并发性,也保证每次写操作对所有的读写操作的可见性

  • 读锁与读锁可以共享
  • 读锁与写锁不可以共享(排他)
  • 写锁与写锁不可以共享(排他)


Lock和synchronized的简单对比

通过我们对Lock的使用以及对synchronized的了解,基本上可以对比出这两种锁的区别了。因为这个也是在面试过程中比较常见的问题

  1. 从层次上,一个是关键字、一个是类, 这是最直观的差异
  2. 从使用上,lock具备更大的灵活性,可以控制锁的释放和获取; 而synchronized的锁的释放是被动的,当出现异常或者同步代码块执行完以后,才会释放锁
  3.  lock可以判断锁的状态、而synchronized无法做到

lock可以实现公平锁、非公平锁; 而synchronized只有非公平锁



标签:同步,synchronized,lock,读锁,初识,线程,Lock,static
From: https://blog.51cto.com/u_11702014/6457120

相关文章

  • m基于FPGA的BPSK调制解调通信系统verilog实现,包含testbench,包含载波同步
    1.算法仿真效果vivado2019.2仿真结果如下:对比没载波同步和有载波同步的仿真效果,我们可以看到,当不存在载波同步时,数据的包络会有一个缓慢的类正弦变换,这是由于存在频偏导致的。而当加入载波同步之后,数据的包络会存在少量起伏,但数据反转的情况已经没有了,说明频偏得到了补偿。......
  • m基于FPGA的BPSK调制解调通信系统verilog实现,包含testbench,包含载波同步
    1.算法仿真效果vivado2019.2仿真结果如下:         对比没载波同步和有载波同步的仿真效果,我们可以看到,当不存在载波同步时,数据的包络会有一个缓慢的类正弦变换,这是由于存在频偏导致的。而当加入载波同步之后,数据的包络会存在少量起伏,但数据反转的情况已经没有了,说......
  • 初识C语言
       通过对C语言的基础知识的简单介绍,对C语言有大概的了解1.什么是C语言    首先我们常说的语言是人与人交流的方式,而C语言是人与计算机交流的一种计算机语言。人----------------------人        人------------------计算机  汉语,英语,法语...  ......
  • Python使用Queue对象实现多线程同步小案例
    queue模块的Queue对象实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交换的场合,实现了多线程编程所需要的所有锁语义。Queue对象主要实现了put()和get()方法,分别用来往队列尾部追加元素和在队列头部获取并删除元素。这两个方法都允许指定超时时间,其用法分别为put(......
  • Python使用Condition对象实现多线程同步
    使用Condition对象可以在某些事件触发后才处理数据或执行特定的功能代码,可以用于不同线程之间的通信或通知,以实现更高级别的同步。在内部实现上,Condition对象总是与某种锁对象相关联。Condition对象除了具有acquire()和release()方法之外,还有wait()、wait_for()、notify()、notify_......
  • 数据同步智能化!利用ETLCloud自动化流程实现钉钉OA系统数据自动同步至数仓
    钉钉数据同步需求钉钉是一款企业级通讯和协同办公应用软件,钉钉为企业提供包括聊天、通讯录、日程安排、考勤打卡、审批、通知公告、文件共享、会议等功能,很多企业都在使用钉钉。很多情况下我们需要把钉钉的数据拉取到数据库中,然后再通过报表工具进行统计分析,实现这种自动化流程......
  • pr 添加马赛克跟踪的时候如何同步预览
    一些对比不鲜明的场景还是要边跟踪边预览的万一跟踪丢失随时停止减少时间浪费如下点击蒙版路径小扳手,勾选预览  会额外消耗一些资源 ......
  • 使用Spring方法注入协调不同步的bean
    使用Spring方法注入协调不同步的bean<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd"><beans><bean......
  • 初识Firebug 全文 — firebug的使用
    初识Firebug全文—firebug的使用什么是Firebug从事了数年的Web开发工作,越来越觉得现在对WEB开发有了更高的要求。要写出漂亮的HTML代码;要编写精致的CSS样式表展示每个页面模块;要调试javascript给页面增加一些更活泼的要素;要使用Ajax给用户带来更好的体验。一个优秀的WEB开发人......
  • 初识vue3——第二天
    计算属性为什么要用计算属性模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们想根据author是否已有一些书籍来展示不同的信息:<scriptsetup>constauthor=reactive({name:'JohnDoe',books:['V......