博客
关于我
Java的锁机制---synchronsized关键字
阅读量:807 次
发布时间:2019-03-26

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

高并发环境下,多线程的共享资源可能引发数据不一致问题。例如,两个线程同时修改同一个静态变量,期望结果为20万,但常常得到少于的数值。

示例程序分析

public class CountWithoutSyn {
private volatile static int count = 0;
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountLatchables(2);
Runnable runnable = new Runnable() {
@Override
public void run() {
for(int i=0; i<100000; i++) {
count++;
}
countDownLatch.countDown();
}
};
new Thread(runnable).start();
new Thread(runnable).start();
countDownLatch.await();
System.out.println("Count: " + count);
}
}

问题分析

  • count应被多次修改:每个线程执行10万次加1。
  • 没有同步机制:导致线程间的操作可能不按顺序执行,造成数据不一致。
  • volatile无法完全解决问题:尽管count是volatile,但在多核处理器下,线程可能并行修改,导致读写混乱。

实验结果

  • 结果通常低于预期:常见结果为 5,000, 15,000,偶尔接近20,000。
  • 极端情况下,结果可能为1,2,20, 99999等

原因解析

  • 线程调度失控:操作系统随机安排线程执行顺序,导致线程无法按期完成。
  • 缓存层次结构:多线程访问同一内存地址,引发缓存一致性问题。
  • 改进建议

    • 添加同步机制:使用同步块ThreadLocal确保线程安全。
    • 优化锁性能:使用ReentrantLockCondition,减少轻量级锁开销。
    • 读写分离的机制:确保读操作和写操作互不干扰,直到完成后再进行读操作。

    总结

    本文通过一个简单例子,展示了在高并发环境中多线程访问共享资源时可能导致的数据不一致问题。虽然volatile确保了解的最新值,但由于多线程的不可预期性和调度机制的复杂性,严格的同步机制仍然是必要的。理性地结合同步机制和调优,可以在保证线程安全的同时,也提高程序的效率和性能。

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

    你可能感兴趣的文章
    Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>
    Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
    查看>>
    Openlayers高级交互(8/20):选取feature,平移feature
    查看>>
    Openlayers高级交互(9/20):编辑图形(放缩、平移、变形、旋转),停止编辑
    查看>>
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>
    OpenLDAP编译安装及配置
    查看>>
    Openmax IL (二)Android多媒体编解码Component
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(二):GD32E23xx FreeRTOS移植
    查看>>
    OpenMCU(五):STM32F103时钟树初始化分析
    查看>>
    OpenMCU(四):STM32F103启动汇编代码分析
    查看>>
    OpenMetadata 命令执行漏洞复现(CVE-2024-28255)
    查看>>
    OpenMMLab | AI玩家已上线!和InternLM解锁“谁是卧底”新玩法
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>