简述 Java 中的线程同步机制,synchronized 关键字和 ReentrantLock 的区别是什么?
- 语法层面
synchronized:是 Java 中的关键字,是一种内置的同步机制。它可以修饰方法或者代码块,使用起来比较简洁。例如:
// 同步方法
public synchronized void method() {
// 同步代码
}
// 同步代码块
public void anotherMethod() {
synchronized (this) {
// 同步代码
}
}
ReentrantLock:是一个类,需要显式地创建锁对象,并调用 lock() 和 unlock() 方法来进行加锁和解锁操作。例如:
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private final ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 同步代码
} finally {
lock.unlock();
}
}
}
- 锁的获取和释放
synchronized:由 JVM 自动获取和释放锁。当线程进入同步方法或同步代码块时,JVM 会自动获取锁;当线程退出同步方法或同步代码块时,JVM 会自动释放锁。
ReentrantLock:需要手动获取和释放锁。如果忘记调用 unlock() 方法,会导致锁无法释放,从而产生死锁问题。因此,通常将 unlock() 方法放在 finally 块中,以确保锁一定会被释放。 - 锁的特性
可重入性:两者都具有可重入性,即同一个线程可以多次获取同一把锁而不会发生死锁。
公平性:
synchronized:是非公平锁,即线程获取锁的顺序是不确定的,可能会导致某些线程长时间得不到锁。
ReentrantLock:可以通过构造函数指定是公平锁还是非公平锁。公平锁会按照线程请求锁的顺序依次分配锁,保证每个线程都有机会获取锁。例如:
import java.util.concurrent.locks.ReentrantLock;
public class FairLockExample {
private final ReentrantLock fairLock = new ReentrantLock(true);
public void method() {
fairLock.lock();
try {
// 同步代码
} finally {
fairLock.unlock();
}
}
}
- 锁的中断
synchronized:线程在等待获取锁的过程中不能被中断,只能一直等待。
ReentrantLock:提供了可中断的锁获取方式,即线程在等待获取锁的过程中可以被中断。例如:
import java.util.concurrent.locks.ReentrantLock;
public class InterruptibleLockExample {
private final ReentrantLock lock = new ReentrantLock();
public void method() throws InterruptedException {
lock.lockInterruptibly();
try {
// 同步代码
} finally {
lock.unlock();
}
}
}
- 锁的尝试获取
synchronized:没有提供尝试获取锁的功能,线程只能一直等待锁的释放。
ReentrantLock:提供了 tryLock() 方法,用于尝试获取锁。如果锁可用,则获取锁并返回 true;如果锁不可用,则立即返回 false,而不会阻塞线程。例如:
import java.util.concurrent.locks.ReentrantLock;
public class TryLockExample {
private final ReentrantLock lock = new ReentrantLock();
public void method() {
if (lock.tryLock()) {
try {
// 同步代码
} finally {
lock.unlock();
}
} else {
// 锁不可用,执行其他操作
}
}
}
简述 Java 中的线程同步机制,synchronized 关键字和 ReentrantLock 的区别是什么?的更多相关文章
- Java中的线程同步机制
一.首先为什么线程需要同步? 1.多线程安全问题的原因 A:有多线程环境 B:有共享数据 C:有多条语句操作共享数据 2. //未完待续后面会继续更新
- Java中的线程同步
Java 中的线程同步问题: 1. 线程同步: 对于访问同一份资源的多个线程之间, 来进行协调的这个东西. 2. 同步方法: 当某个对象调用了同步方法时, 该对象上的其它同步方法必须等待该同步方法执行 ...
- Java基础-多线程-③线程同步之synchronized
使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...
- Java多线程 | 02 | 线程同步机制
同步机制简介 线程同步机制是一套用于协调线程之间的数据访问的机制.该机制可以保障线程安全.Java平台提供的线程同步机制包括: 锁,volatile关键字,final关键字,static关键字,以 ...
- Java多线程之线程同步【synchronized、Lock、volatitle】
线程同步 线程同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多. ...
- java并发之线程同步(synchronized和锁机制)
使用synchronized实现同步方法 使用非依赖属性实现同步 在同步块中使用条件(wait(),notify(),notifyAll()) 使用锁实现同步 使用读写锁实现同步数据访问 修改锁的公平 ...
- java中实现线程同步
为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他 ...
- java并发:线程同步机制之ThreadLocal
1.简述ThreadLocal ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程.ThreadLocal是一个线程级别的局部变量 ...
- java并发:线程同步机制之Volatile关键字&原子操作Atomic
volatile关键字 volatile是一个特殊的修饰符,只有成员变量才能使用它,与Synchronized及ReentrantLock等提供的互斥相比,Synchronized保证了Synchro ...
- java并发:线程同步机制之Lock
一.初识Lock Lock是一个接口,提供了无条件的.可轮询的.定时的.可中断的锁获取操作,所有加锁和解锁的方法都是显式的,其包路径是:java.util.concurrent.locks.Lock, ...
随机推荐
- Feign Client 超时时间配置
在Spring Boot微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而在业务场景比较简单的时候,使用默认配置是不会遇到多大问题的.但是如果业务比较复杂,服务要进行比较繁杂 ...
- 代码随想录第九天 | 栈与队列part01
那很好了,时间来到了第九天, 理论基础 了解一下 栈与队列的内部实现机制,文中是以C++为例讲解的. 文章讲解:https://programmercarl.com/栈与队列理论基础.html 232 ...
- Pod的调度
在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的.但是在实际使用中,这并不满足需求,因为很多情况下,我们想控制某些Pod到 ...
- Redis五-哨兵
目录 哨兵 导读 基本概念 主从复制问题 Redis Sentinel的高可用性 安装和部署 部署数据节点 部署Sentinel节点 Seninel配置优化 sentinel API 实现原理 三个定 ...
- ARC158(A~D)
Tasks - AtCoder Regular Contest 158 实际上是114514年前做的来着,非常好的数学(跟数论无关)/思维题集(\(A\)~\(D\)) A - +3 +5 +7 (a ...
- 别再被 Spring Security 和 Shiro 劝退了!这款国产 Java 权限框架真香!
Hello,大家好,我是程序员NEO. 在 Java 开发中,权限认证是个绕不开的话题.但一提起 Spring Security 或 Shiro,很多人是不是瞬间就头大了?复杂的配置.陡峭的学习曲线, ...
- vue快速入门~必备基础知识(一)上
和JQ完全操作dom不同,他是通过一些特殊的html语法,将dom和数据绑定,创建了这种绑定,DOM和数据保持同步,js处数据一更新,dom自动更新. vue.js是javascript MVVM库( ...
- laravel项目上传Linux服务器
第一次上传项目:记录一下遇到的问题!!! #1)工具:腾讯云服务器and域名(以解析) Xshell(强大的安全终端模拟软件) 链接:https://pan.baidu.com/s/1we6dw5ys ...
- 尚硅谷SpringMVC学习笔记第10-13节(文件上传和下载、拦截器、异常处理器、注解配置SpringMVC)
转载于https://blog.csdn.net/weixin_57341232/article/details/126423746
- VUE加Vite创建项目
首先需要找到Vite 官网,然后点击开始 Vite 需要 Node.js 版本 >= 12.0.0. $ npm init vite@latest 不知道之前为什么不行,装了一下旧的版本,然后再 ...