博客
关于我
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/

    你可能感兴趣的文章
    nagios+cacti整合
    查看>>
    Nagios介绍
    查看>>
    nagios利用NSCient监控远程window主机
    查看>>
    nagios安装文档
    查看>>
    nagios服务端安装
    查看>>
    Nagios自定义监控脚本
    查看>>
    name_save matlab
    查看>>
    Nami 项目使用教程
    查看>>
    Nancy之基于Nancy.Hosting.Aspnet的小Demo
    查看>>
    NAND NOR FLASH闪存产品概述
    查看>>
    nano 编辑
    查看>>
    nanoGPT 教程:从零开始训练语言模型
    查看>>
    NASA网站曝严重漏洞,或将沦为黑客钓鱼网站?
    查看>>
    Nash:轻量级、安全且可靠的脚本语言
    查看>>
    NAS、SAN和DAS的区别
    查看>>
    NAS个人云存储服务器搭建
    查看>>
    NAS服务器有哪些优势
    查看>>
    NAT PAT故障排除实战指南:从原理到技巧的深度探索
    查看>>
    nat 网卡间数据包转发_你是不是从来没有了解过光纤网卡,它跟普通网卡有什么区别?...
    查看>>
    NAT-DDNS内网穿透技术,快解析DDNS的优势
    查看>>