首页 > 编程语言 >JAVA基础:Lock不同的锁形式

JAVA基础:Lock不同的锁形式

时间:2024-10-09 08:51:45浏览次数:3  
标签:同步 JAVA synchronized Lock 形式 获得 线程 new

1.1 可重入锁

  • synchronized就是一个可重入锁

  • 使用lock时,常用的ReentryLock就是可重入锁

  • 当一个线程在获得a对象锁之后,可以继续重复获得对象锁

  • 代码形式就是 线程调用同步代码段,在没有执行完毕前,又调用了该对象的另一个同步代码段

public class Test4 {
    public static void main(String[] args) {
        new ReentrantLock().unlock();

        Thread t1 = new Thread(()->{
           t1();  // 0 - 1
        });
        t1.start();
    }

    public static synchronized void t1(){
        t2(); // 1 - 2
    } // 1 - 0
    public static synchronized void t2(){
    } //2 - 1
}

  • 当线程1进入同步代码段时,会记录线程1的信息,表示线程1获得了锁,同时锁状态0 - 1

  • 当线程1重复进入需要当前对象锁的同步代码段时,会检测之前检录的线程信息

    如果之前记录的线程信息和当前进入的线程信息相同,说明重入,允许,同时状态1 - 2

    如果之前记录的线程信息和当前进入的线程信息不同,说明新线程访问,加入同步队列等待。

  • 当前线程离开同步代码段时,会释放锁,本质就是状态 2 - 1 或 1 - 0

注意:

  • 针对于Lock锁,加锁的数量和释放锁的数量应该保持相同。

  • 否则会产生死锁。

  • synchronized 和 lock都可能会产生死锁

    • synchronized 两个线程同时需要彼此所占有的资源

    • lock最常见的死锁情况,就是获得锁后忘释放了。

1.2 公平锁和非公平锁

  • synchronized 属于非公平锁

  • Lock之ReentryLock创建锁对象时,可以通过传参指定公平或非公平。默认是非公平锁

new ReentryLock(true);//公平锁
new ReentryLock(false);//非平锁

  • 假设, 有n个线程同时访问同步资源,只有1个线程可以获得锁,其他n-1个线程进入同步队列,等待

  • 当然,这n-1个线程,进入同步队列后,会有一个先后顺序

  • 当第一个线程释放锁资源后, 同步队列中那n-1个线程,会按顺序依次获得锁 (倒序 或 顺序)

  • 当线程1释放锁的同时,又来了一个新线程要想要争抢锁

    • 这个新线程,直接存于锁的争抢, 就称非公平锁

    • 这个新线程,直接进入同步队列,等待前面的线程释放锁。 就称公平锁

1.3 排它锁 和 共享锁

  • 排它锁又称为 互斥锁,也称为 独享锁,当一个线程获得该锁, 其他线程无法获得锁,需要等待

    • synchronized就是一个排它锁

    • Lock中提供了不同的实现

  • 共享锁, 多个线程可以同时获得这个锁。

  • 在Lock应用当中,有一个读写锁,就是对排它锁和共享锁的使用

    • 读写就是 共享锁

    • 写锁就是 排它锁

ReentrantReadWriteLock tool = new ReentrantReadWriteLock();
Lock lock1 = tool.readLock();
Lock lock2 = tool.writeLock();

  • 两个线程可以同时获得读锁

  • 两个线程只能有一个获得写锁,另一个等待

  • 一个线程获得读锁, 另一个线程尝试获得写锁会失败,进入等待状态。

  • 一个线程获得写锁, 另一个线程尝试获得读锁会失败,进入等待状态

public class Test5 {
    public static void main(String[] args) throws InterruptedException {
        ReentrantReadWriteLock tool = new ReentrantReadWriteLock();
        Lock lock1 = tool.readLock();
        Lock lock2 = tool.writeLock();

        Thread t1 = new Thread(()->{
            lock1.lock();
            for(int i=1;i<=5;i++){
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            lock1.unlock();
        });

        Thread t2 = new Thread(()->{
            lock2.lock();
            for(int i=11;i<=15;i++){
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            lock2.unlock();
        });

        t2.start();
        Thread.sleep(10);
        t1.start();

    }
}

1.4 悲观锁 和 乐观锁

标签:同步,JAVA,synchronized,Lock,形式,获得,线程,new
From: https://blog.csdn.net/weixin_53755148/article/details/142774296

相关文章

  • 【java 使用 ffmpeg 将rtsp转hls】
    java海康接口ffmpeg提示海康相关文件开发准备工具使用获取监控列表ffmpeg转换视频流视频流转换导入提示java使用SpringBoot框架jdk使用1.8版本海康通过访问OpenAPI文档中心的方式可以验证API网关是否安装成功,访问地址http://IP:Port/artemis-portal/......
  • javascript学习——CSS 操作总结
    CSS操作CSS与JavaScript是两个有着明确分工的领域,前者负责页面的视觉效果,后者负责与用户的行为互动。但是,它们毕竟同属网页开发的前端,因此不可避免有着交叉和互相配合。本章介绍如何通过JavaScript操作CSS。HTML元素的style属性操作CSS样式最简单的方法,就是......
  • javascript学习——DOM 概述
    DOM概述DOMDOM是JavaScript操作网页的接口,全称为“文档对象模型”(DocumentObjectModel)。它的作用是将网页转为一个JavaScript对象,从而可以用脚本进行各种操作(比如增删内容)。浏览器会根据DOM模型,将结构化文档(比如HTML和XML)解析成一系列的节点,再由这些节点组......
  • Java开发之JDK下载
    JDK是什么?JDK(JavaDevelopmentKit)是Java开发工具包,包含了编译、运行Java程序所需的工具和环境。如何下载JDK?访问Oracle官网:打开Oracle的Java官网:JavaDownloads|Oracle选择适合的版本:根据你的操作系统(Windows、macOS、Linux)和项目需求选择合适的JDK版本。一般来说,选......
  • 【C语言】输出数据的二进制存储形式
        说在前面:是一个C语言新手,很新的新手,在这个专栏记录一些探索过程    今天学习中学到类型转换,将int和short类型赋值给char类型变量时,因为想要清楚看到隐式转换的结果,产生了写一个东西来输出数据在计算机中的二进制存储形式的想法,以下为尝试过程一、首先想......
  • 基于数据可视化+Javaweb实现的物流管理系统设计与实现(源码+数据库+论文+部署+文档+讲
    文章目录前言系统演示录像论文参考代码运行展示图技术框架SpringBoot技术介绍系统测试系统测试的目的系统功能测试推荐选题:代码参考实现案例找我做程序,有什么保障?联系我们前言......
  • 基于数据可视化+Java+SpringBoot+Vue实现的高校食堂移动预约点餐系统设计与实现
    文章目录前言系统演示录像论文参考代码运行展示图技术框架SpringBoot技术介绍系统测试系统测试的目的系统功能测试推荐选题:代码参考实现案例找我做程序,有什么保障?联系我们前言......
  • java学习笔记3-高级循环-练习题
    黑马java有关数组的几道感觉比较难的题目,记录一下。第一题现有一个整数数组,数组中的每个元素都是[0-9]之间的数字,从数组的最大索引位置开始到最小索引位置,依次表示整数的个位、十位、百位。。。依次类推。请编写程序计算,这个数组所表示的整数值。例如:数组:{2,1,3,5,4}......
  • JAVA面试八股文(上)
    Object有哪些方法?hashcode,equals,wait(), tostringhashcode和equals有什么关系?Java中规定,hashcode相同equals不一定相同,equals相同那么hashcode一定相同,如果违反这种规则hashMap和hashSet不能正常使用wait和sleep有什么区别?sleep()方法线程不会释放对象锁,wait()方法线......
  • java JNDI 注入学习
    javaJNDI注入学习JavaNamingDirectoryInterface,Java命名和目录接口,是SUN公司提供的一种标准的Java命名系统接口。通过调用JNDI的API应用程序可以定位资源和其他程序对象。JNDI可访问的现有目录及服务包括:JDBC(Java数据库连接)、LDAP(轻型目录访问协议)、RMI(远程方法调用)、DNS(域......