文章目录1. Java锁的种类1.1 乐观锁1.2 悲观锁1.3 自旋锁1.4 其他种类锁…2. synchronized同步锁(悲观锁)2.1 synchronized 作用范围2.2 synchronized 核心组件2.3 synchronized 实现 1. Java锁的种类 1.1 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低。 每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出,然后加锁操作(比较跟上一次的修改版本,如果一样则更新),如果失败则要重复读-比较-写的操作。 Java 中 【Java】synchronized同步锁详解 Java 中的同步机制主要用于解决多线程环境下的数据安全问题,其中synchronized关键字是Java提供的一种内置锁,也称为监视器锁或悲观锁。synchronized可以确保在同一时刻,只有一个线程能执行特定的代码块,从而保证线程安全。 1. Java锁的种类: - **乐观锁**:乐观锁假设并发冲突较少,读多写少,通常采用CAS(Compare and Swap)操作实现。例如,Java中的Atomic变量类如AtomicInteger、AtomicReference等。 - **悲观锁**:悲观锁假设并发冲突频繁,每次访问数据时都会加锁,确保数据不会被其他线程修改。Java中的synchronized就是悲观锁的典型代表。 - **自旋锁**:自旋锁在等待获取锁时,线程不会被挂起,而是不断检查锁的状态,直到获取锁为止。如果持有锁的线程很快释放,自旋锁效率较高,但如果持有锁的线程长时间不释放,自旋会导致CPU资源浪费。Java中ReentrantLock的公平锁在未获取锁时会先尝试自旋。 2. **synchronized同步锁(悲观锁)**: - **作用范围**: - 作用于实例方法:锁定当前对象实例,同一时刻只允许一个线程访问该对象的所有同步方法和同步代码块。 - 作用于静态方法:锁定当前类的Class实例,意味着所有调用该静态方法的线程都会被阻塞,无论它们属于哪个对象实例。 - 作用于对象实例:锁定指定的对象,使得在同一时刻,对同一个对象的同步代码块或同步方法只能有一个线程访问。 - **核心组件**: - Wait Set:等待的线程集合,调用wait()方法后,线程会进入此集合并释放锁。 - Contention List:竞争队列,新请求锁的线程首先加入这里。 - Entry List:从Contention List中筛选出有资格竞争的线程放入Entry List。 - OnDeck:当前正尝试获取锁的线程。 - Owner:持有锁的线程。 - !Owner:释放锁的线程。 - **实现**: - JVM在处理锁竞争时,会将线程从Contention List移动到Entry List,然后从Entry List选择一个线程作为OnDeck。解锁时,会将部分Contention List中的线程迁移到Entry List,准备下一次锁的获取。 synchronized的使用需要注意以下几点: - 不能被中断的阻塞:synchronized关键字导致的阻塞是无法通过interrupt()方法中断的。 - 不可避免的性能开销:虽然synchronized提供了线程安全性,但会导致线程上下文切换,影响性能。 - 死锁风险:不正确的使用synchronized可能导致死锁,即多个线程相互等待对方释放资源,造成系统停滞。 正确理解和使用synchronized是Java并发编程的关键,它能够保证数据的一致性和完整性,防止数据的不一致。在实际开发中,根据具体情况选择适合的锁类型,可以有效地提高程序的并发性能。
- 粉丝: 4
- 资源: 949
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 环境科学中的蒙特卡洛模拟:不确定性的量化与风险评估
- Riscv五级流水线32位cpu,systemverilog编写,指令集rv32i,支持数据前递,csr寄存器与中断控制器,可跑
- IST7156规格书vvvv
- c-for-derivative-pricing
- 自动化代码部署报告:C++项目中的实践与策
- 基于扰动观察法 电导增量法的光伏电池最大功率点跟踪仿真模型 (PLECS平台搭建)
- 基于虚拟阻抗的微电网下垂控制 在微电网中,由于线路阻抗的不同,造成无功功率无法均分,通过添加虚拟阻抗是应用最为广泛的一种方法
- 2013.08.05 C001001 牛顿用他的无穷算法研究圆周运动
- 交通流量分析中的蒙特卡洛模拟:随机性与复杂性的解决之道
- 利用VITO数据集进行2014年至今的NDVI时序监测.ipynb