Java基础知识-线程同步和锁

1、实现线程同步有三种方式?

1.  同步代码块:在代码块上加上“synchronized”关键字的话,则此代码块就称为同步代 码块。

//同步代码块格式:

synchronized(监视对象){

//需要同步的代码 ;

}

解释:监视对象有三种:对象、String、.class 文件(只要是不变的对象都可以做监 视对象)

1.  同步方法

//同步方法定义格式:

synchronized 方法返回值 方法名称(参数列表){

}

//在方法上加 synchronized,是把当前对象做为监视器

1.  同步锁

Lock lock = new ReentrantLock();//(可以在类中直接 new)

lock.lock(); //中间的代码块进行加锁 lock.unlock();

2、Java中的锁有几种方式?

1.  Synchronized

2.  Lock

Synchronized的局限性:

● a. 如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能等待。(不能主动释放锁)

● b.当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象如果多个线程都只是进行读操作,所以当一个线程在进行读操作时,其他线程只能等待无法进行读操作。(不分情况,一律锁死)

3、Lock的几个实现类?

● ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。

● ReadWriteLock,顾名思义,是读写锁。它维护了一对相关的锁 ——“读取锁”和“写入锁”,一个用于读取操作,另一个用于写入操作。他的两个实现类读锁readerLock和写锁writerLock。

4、synchronized 和 Lock 的区别和应用场景?

1.  Lock 是接口,而 synchronized 是 Java 中的关键字,synchronized 是内置的语言实现;

2.  synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁;

3.  Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用synchronized 时,等待的线程会一直等待下去,不能够响应中断;

4.  通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

5.  Lock 可以提高多个线程进行读操作的效率。

6.  Lock 能完成 Synchronized 所实现的所有功能在性能上来说,如果竞争资源不激烈,Synchronized 要优于 Lock,而当竞争资源非常激烈时(即有大量线程同时竞争),此时 Lock 的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

5synchronized 和 ReentrantLock 区别是什么?

1)底层实现

synchronized 是JVM层面的锁,是Java关键字ReentrantLock 是从jdk1.5以来(java.util.concurrent.locks.Lock)提供的API层面的锁。

synchronized通过monitor对象来完成(monitor enter与monitor exit),对象只有在同步块或同步方法中才能调用wait/notify方法 synchronized的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、向OS申请重量级锁

ReentrantLock实现则是通过利用CAS(CompareAndSwap)自旋机制保证线程操作的原子性和volatile保证数据可见性以实现锁的功能。

2)是否可手动释放:

synchronized 不需要用户去手动释放锁,synchronized 代码执行完后系统会自动让线程释放对锁的占用;

ReentrantLock则需要用户去手动释放锁,如果没有手动释放锁,就可能导致死锁现象。一般通过lock()和unlock()方法配合try/finally语句块来完成,使用释放更加灵活。

3是否可中断

synchronized是不可中断类型的锁,除非加锁的代码中出现异常或正常执行完成; ReentrantLock则可以中断,可通过trylock(long timeout,TimeUnit unit)设置超时方法或者将lockInterruptibly()放到代码块中,调用interrupt方法进行中断。

4)锁的对象

synchronzied锁的是对象,锁是保存在对象头里面的,根据对象头数据来标识是否有线程获得锁/争抢锁;ReentrantLock锁的是线程,根据进入的线程和int类型的state标识锁的获得/争抢。

6、synchronized与volatile、Lock、ReentrantLock的区别

synchronized与volatile

synchronized

volatile

作用

锁定当前对象,只有当前线程可以访问该对象,其他线程被阻塞。

本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;

使用范围

变量、方法、和类

变量

线程安全

可以保证变量的可见性和原子性

仅能实现变量的可见性,不能保证原子性

阻塞

可能会造成线程的阻塞

不会造成线程的阻塞

优化

标记的变量可以被编译器优化

标记的变量不会被编译器优化

synchronized与Lock

synchronized

Lock

存在层面

java 内置关键字,在 jvm 层面

java 类(实际是一个接口),在API层面

锁的释放

会自动释放锁: 线程执行完同步代码会释放锁 ; 线程执行中发生异常会释放锁

需在 finally 中手工释放锁(unlock()方法释放锁)

锁的获取

若线程 1 获得锁,线程 2 等待; 若线程 1 阻塞,线程 2 会一直等待

分情况而定,Lock有多个获得锁的方式。 可尝试获得锁(tryLock()),线程可以不用一直等待

锁状态

无法判断是否已经获取锁

可判断是否已经获取到锁

锁类型

可重入、不可中断、非公平 (只能等待锁释放,不能响应中断)

可重入、可中断、可公平(两者皆可) (等待锁时可用interrupt来中断等待)

适用场景

简单的线程同步控制。

多线程竞争的概率很高。

复杂的线程同步控制(比如:公平锁、读写锁)。多线程竞争的概率很低。

性能

jdk1.6以前:重量级锁(无法取得锁即挂起,性能差) jdk1.6之后:优化了性能:给它的锁加入了四种状态,无锁状态 -> 偏向锁 -> 轻量级锁 -> 重量级锁,自动进行锁的升级。

jdk1.6以后: Lock性能略好于synchronized

synchronized与ReentrantLock

相同点

说明

同步方式

都是加锁方式同步

是否可重入

都是可重入锁

是否阻塞

都是阻塞式的同步

不同点

因为ReentrantLock实现了Lock,所以拥有synchronized与Lock的所有不同点,其他不同点如下:

synchronized

ReentrantLock

锁条件个数

1个

可以多个

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TensorFlow深度学习】自动回归模型在自我监督视觉特征学习中的应用

自动回归模型在自我监督视觉特征学习中的应用 在深度学习的探索之路上,自动回归模型凭借其独特的序列生成能力,在自我监督学习领域,尤其是在视觉特征学习方面,展现出了非凡的应用潜力。本文将深入剖析自动回归模型如何在计算机视觉中发挥作用,通过实例分析、理论探讨和未来…

#### grpc比http性能高的原因 ####

grpc比http性能高的原因 二进制消息格式:gRPC使用Protobuf(一种有效的二进制消息格式)进行序列化,这种格式在服务器和客户端上的序列化速度非常快,且序列化后的消息体积小,适合带宽有限的场景。 HTTP/2协…

海思SS928/SD3403开发笔记4——u盘挂载

首先一定要将u盘格式化成fat32。 挂载 mkdir /mnt/usb mount /dev/sda1 /mnt/usb成功示意图: 取消挂载 umount /mnt/usb

lighttpd安装和配置https

apt install lighttpd apt-get install php-cgi lighttpd-enable-mod fastcgi fastcgi-php service lighttpd force-reload lighttpd配置https sudo nano /etc/lighttpd/lighttpd.conf加入: server.modules ("mod_openssl") $SERVER["socket&quo…

59、Flink 的异步 IO 算子使用线程池查询 MySQL

1、概述 -----------Test1----------- 非静态 dataSource 和 executorService【一个并行度(Task 线程)一个实例】 分区1 dataSource>915342614 executorService>2120731873 分区2 dataSource>1271767714 executorService>844411403 并行度2…

数智化赋能水务行业高质量发展

数智化赋能水务行业高质量发展是指通过数字化和智能化技术的应用,提升水务行业的管理效率、服务质量和运营安全,实现可持续发展。以下是数智化赋能水务行业高质量发展的几个关键方面: 1. 智能水务管理平台 集成数据中心:建立统一…

C#——命名空间详情

命名空间 在 C# 中,可以将命名空间看作是一个范围,用来标注命名空间中成员的归属,一个命名空间中类与另一个命名空间中同名的类互不冲突,但在同一个命名空间中类的名称必须是唯一的。 定义命名空间 定义命名空间需要使用 namesp…

JS在线加密简述

JS在线加密,是指:在线进行JS代码混淆加密。通过混淆、压缩、加密等手段,使得JS源代码难以阅读和理解。从而可以有效防止代码被盗用或抄袭,保护开发者的知识产权和劳动成果。常用的JS在线加密网站有:JShaman、JS-Obfusc…

怎么在vite项目中全局导入一个scss文件

怎么在vite项目中全局导入一个scss文件 🎉🎉🎉欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!&#x1f64…

如何快速找到CAN总线的故障节点?

如何快速找到CAN总线的故障节点? 1、节点(数量不多的情况)依次接入总线:将CAN节点一个一个往总线上接,每接一个节点后观察、测试总线通信状况。2、使用CAN转换器或接口类产品辅助排查。(快速定位&#xff…

【Redis】Java操作Redis(Jedis客户端使用)

Redis不仅支持简单的键值存储,还提供了丰富的数据结构(如列表、哈希表、集合等)和强大的原子操作,使得它在存储和处理数据时非常高效。关于这些数据结构的学习可以学习下面的博客: 【Redis】String的常用命令及图解St…

OBD诊断(ISO15031) 01服务

文章目录 功能简介PID 的功能请求和响应1、read-supported PIDs1.1、请求1.2、肯定响应 2、read PID value1.1、请求1.2、肯定响应 3、同时请求多个PID3、同时读取多个PID数据 Parameter definition报文示例1、单个PID请求和读取2、多个PID请求和读取 功能简介 01服务&#xf…

XML 技术

XML 技术 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它由万维网联盟(W3C)开发,并在1998年成为正式标准。XML的设计目标是既易于人类阅读,也易于机器解析。它是一种自描述的语言,允许用户定义自己的标签和文档结构。XML被广泛应用于各种领域,包括网络服…

【Ubuntu24.04无显示器远控】【Todesk远程桌面黑屏】【Linux虚拟显示器】解决方案

1️⃣版本 Ubuntu 24.04Todesk 4.7.2.0xserver-xorg-video-dummy 1:0.4.0-1build1 2️⃣安装配置虚拟显示器 sudo apt install xserver-xorg-video-dummy编辑/etc/gdm3/custom.conf,关闭Ubuntu24.04Wayland切换为X11 WaylandEnablefalse /usr/share/X11/xorg.con…

NDT(基于正态分布变换的配准算法)

NDT是将单个扫描的离散点集转换为空间上定义的分段连续可微概率密度,该概率密度由一组易于计算的正态分布组成的算法。采用NDT连续化后,传统硬离散优化问题能够潜在地转化为更易于处理的连续优化问题。 NDT原理 NDT将根据点云中点所处的位置&#xff0…

网络治理新模式:Web3时代的社会价值重构

随着Web3技术的崛起,传统的网络治理模式正在经历革新,这不仅仅是技术的进步,更是对社会价值观念的挑战和重构。本文将深入探讨Web3时代的网络治理新模式,其背后的技术基础、社会影响以及未来的发展方向。 1. 引言 Web3时代&#…

Java中的函数式编程入门

Java中的函数式编程入门 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我来为大家介绍一下Java中的函数式编程。随着Java 8的发布,函数式编程成…

使用Spring Boot实现与ActiveMQ的消息队列集成

使用Spring Boot实现与ActiveMQ的消息队列集成 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 消息队列在现代分布式系统中扮演着至关重要的角色,…

智慧营区人员管理系统|DW-S406系统特点

1、项目背景 当前我国军队正处于加紧完成机械化和信息化建设双重历史任务的阶段,现阶段我国对军事通信领域强有力的支持性产业政策,将为行业的未来发展提供有力保障。随着经济实力的不断增长,以及国际、周边政治局势的日趋复杂,我…

# 音频处理4_傅里叶变换

1.离散傅里叶变换 对于离散时域信号 x[n]使用离散傅里叶变换(Discrete Fourier Transform, DFT)进行频域分析。 DFT 将离散信号 x[n] 变换为其频谱表示 X[k],定义如下: X [ k ] ∑ n 0 N − 1 x [ n ] e − j 2 π k n N X[k]…