博客
关于我
Synchronized关键字及锁升级
阅读量:264 次
发布时间:2019-03-01

本文共 1153 字,大约阅读时间需要 3 分钟。

Java并发编程中的锁机制深入解析

一、同步机制的作用与原理

在Java中,synchronized关键字是用来实现线程安全的重要机制。它通过锁机制确保同一时间只能有一个线程访问共享资源,避免了竞态条件和并发 bug。以下是synchronized的核心作用:

1. 原子性

synchronized确保所有操作在单个原子操作内完成,避免了部分执行的情况。线程在获得锁后,会在同一时间内完成整个操作,减少了并发问题的发生概率。

2. 可见性

线程之间的工作内存是独立的,synchronized机制通过主内存同步所有线程的工作内存,确保所有线程都能访问最新的数据版本。这种机制防止了数据不一致的问题。

3. 有序性

synchronized保证了执行顺序的有序性,即便在多核处理器下,同一时间只能有一个线程执行同步块中的代码,保证了程序的执行结果一致性。

二、synchronized的实现原理

1. 方法锁

synchronized修饰的方法锁对象是当前实例(this),通过对象内部的monitor机制实现同步。只有当前线程持有锁才能进入方法,其他线程进入时会等待。

2. 静态方法锁

synchronized修饰的静态方法锁对象是Class对象,同样基于monitor机制实现同步,适用于类级共享资源。

3. 代码块锁

通过monitorenter和monitorexit指令,synchronized代码块锁对象是指定的对象。进入时将锁计数器增加,退出时将计数器减少,计数器为零时释放锁。

三、Java中的锁机制优化

1. 偏向锁

偏向锁是Java优化的锁机制,适用于大多数情况下单线程竞争的场景。对象在第一次被访问时会生成偏向锁标识,后续访问只需对比标识位即可加锁,减少了加锁的开销。

2. 轻量级锁

轻量级锁在有轻量级竞争时使用。通过自旋的方式等待锁释放,避免线程切换的开销,提升性能。

3. 重量级锁

当自旋次数过多或存在严重竞争时,轻量级锁会升级为重量级锁,阻塞所有其他线程,确保加锁的 fairness。

四、无锁机制的应用

无锁机制通过CAS操作实现资源的原子性修改,适用于大多数情况下无需严格竞争的场景。它通过不阻塞的方式提升性能,但在高并发场景下需谨慎使用。

五、锁机制的优化与演变

Java对锁机制进行了多次优化:

  • 偏向锁:减少了加锁的开销,适用于单线程竞争。
  • 轻量级锁:通过自旋等待,减少线程切换的开销。
  • 重量级锁:用于严重竞争场景,确保公平性。
  • 这些优化使得Java的锁机制在高并发环境下表现更优,适合不同场景的需求。

    六、总结

    synchronized机制通过锁机制实现了线程安全,支持多种锁类型,适用于不同场景。理解这些机制有助于在并发编程中做出更好的选择,提升程序性能。

    转载地址:http://aziv.baihongyu.com/

    你可能感兴趣的文章
    NR,NF,FNR
    查看>>
    nrf24l01+arduino
    查看>>
    nrf开发笔记一开发软件
    查看>>
    nrm —— 快速切换 NPM 源 (附带测速功能)
    查看>>
    nrm报错 [ERR_INVALID_ARG_TYPE]
    查看>>
    NS3 IP首部校验和
    查看>>
    NSDateFormatter的替代方法
    查看>>
    NSError 的使用方法
    查看>>
    NSGA-Ⅲ源代码
    查看>>
    nsis 安装脚本示例(转)
    查看>>
    NSJSON的用法(oc系统自带的解析方法)
    查看>>
    nslookup 的基本知识与命令详解
    查看>>
    NSNumber与NSInteger的区别 -bei
    查看>>
    NSOperation基本操作
    查看>>
    NSRange 范围
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NSURLSession下载和断点续传
    查看>>
    NSUserdefault读书笔记
    查看>>
    NS图绘制工具推荐
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>