synchronized和lock的区别

devtools/2024/10/11 11:23:59/

synchronizedLock 都是Java中用于实现线程同步的手段,它们有以下主要区别:

synchronized(同步关键字)

  1. 内置锁synchronizedJava的一个关键字,它是一个内置锁,由JVM自动管理。
  2. 使用方便:使用synchronized,你只需要在方法声明或代码块前加上synchronized关键字即可。
  3. 不可中断方法:当一个线程执行synchronized方法或块时,其他线程必须等待直到该线程退出同步代码块。
  4. 悲观锁synchronized 是一种悲观锁,它假设冲突发生的可能性较大,因此它会直接上锁。
  5. 锁状态不可改变synchronized 锁定后,无法改变锁状态,它要么锁定,要么不锁定。
  6. 公平性synchronized 不支持公平性设置,即等待时间最长的线程并不一定会最先获得锁。
  7. 功能限制synchronized 只提供了基本的同步功能,没有高级功能,如尝试非阻塞地获取锁、超时等待等。

Lock(锁对象)

  1. 显示锁LockJava java.util.concurrent.locks 包中的一个接口,它是一个显示锁,需要程序员手动管理。
  2. 灵活性高Lock 提供了更复杂的线程控制,例如,可以尝试非阻塞地获取锁、可以响应中断、可指定公平性等。
  3. 可中断:执行Lock的线程可以响应中断,即在等待获取锁的过程中可以中断等待。
  4. 公平性Lock 可以实现公平性,即等待时间最长的线程可以最先获得锁(通过ReentrantLock的构造函数设置)。
  5. 多种锁模式Lock 提供了多种锁模式,如读写锁(ReadWriteLock)。
  6. 悲观/乐观锁Lock 可以实现悲观锁和乐观锁,例如,ReentrantLock 是悲观锁,而StampedLock 是乐观锁。
  7. 高级功能Lock 提供了更多的高级功能,如尝试获取锁、超时获取锁、尝试获取锁后响应中断等。

示例

java">// 使用 synchronized
public synchronized void synchronizedMethod() {// 同步代码
}// 使用 Lock
Lock lock = new ReentrantLock();
public void lockMethod() {lock.lock(); // 获取锁try {// 同步代码} finally {lock.unlock(); // 释放锁}
}

总结

synchronizedLock 都可以用于线程同步,但它们在用法和功能上有所不同。synchronized 是一种内置锁,使用简单,但功能有限。Lock 是一个显示锁,提供了更多的控制和灵活性,适用于需要高级同步功能的场景。在实际编程中,根据具体需求选择合适的同步机制是非常重要的。


http://www.ppmy.cn/devtools/6615.html

相关文章

Java垃圾回收1

1.对象什么时候可以被垃圾器回收 1.垃圾回收的概念 为了让程序员更专注于代码的实现,而不用过多的考虑内存释放的问题,所以, 在Java语言中,有了自动的垃圾回收机制,也就是我们熟悉的GC(Garbage Collection)。 有了垃圾…

STM32H750外设ADC之双重 ADC 模式

目录 概述 1 双重 ADC 模式介绍 1.1 双重 ADC模式 1.2 双重 ADC 模式的类型 2 双重 ADC 模式寄存器的配置 3 模式功能实现 3.1 注入同步模式 3.2 支持独立注入的常规同步模式 3.2.1 中断的方式 3.2.2 DMA 读取常规数据 3.3 支持独立注入的交替模式 3.3.1 中断触发…

【Linux的git操作】

Linux学习笔记---010 Linux的git操作1、什么是gitee2、git 准备工作2.1、查看是否安装了 git 版本工具2.2、安装 git 工具/更新成最新版本2.3、在gitee上创建远程仓库(略)2.4、提交file的初始化操作 3、git的“三板斧”3.1、add3.2、commit3.3、push3.4、…

Ubuntu 22.04.4 LTS 初始配置(root、ssh)

开启root 设置 root 用户的密码。 在终端中输入以下命令并按 Enter 键: sudo passwd root然后,你需要输入你的当前用户密码以获取sudo权限,接着你将被提示输入新的 root 密码。输入你想要设置的密码,然后再次输入以确认。 启用…

Kubernetes(k8s)集群搭建部署,master节点配置

目录 1.切换为root用户 2.关闭防火墙,关闭swap分区和禁用SElinux 3.安装docker 4.更改daemon.json文件,指定 Docker 守护进程使用的 cgroup 驱动程序 5.重启docker服务 6.配置kubernetes.repo 7.安装Kubelet、Kubeadm、Kubectl 8.设置开机自启

【Redis(4)】Redis主从复制模式配置示例

Redis的三种高可用方案对比参考上一篇博客:深入理解Redis三种高可用方案,以做出明智的选择,下面要探讨的是三种方案其中的一种。 在构建高性能的缓存系统时,Redis以其卓越的性能和简单性成为了首选。本文将探讨Redis主从复制的工…

uniapp h5项目上传图片到oss(纯前端)

需求:后端给前端一个oss上传地址,前端需要根据getCkOSSToken获取stsToken,使用client.put方法将图片上传成功,并且使用canvas压缩图片 效果图 废话不多说,直接上代码,代码可直接复制,运行 准备工作 cnpm…

最新Java面试题3【2024中级】

互联网大厂面试题 1:阿里巴巴Java面试题 2:阿里云Java面试题-实习生岗 3:腾讯Java面试题-高级 4:字节跳动Java面试题 5:字节跳动Java面试题-大数据方向 6:百度Java面试题 7:蚂蚁金服Java…