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

    你可能感兴趣的文章
    MySQL索引原理以及查询优化
    查看>>
    Mysql索引底层结构的分析
    查看>>
    MySQL索引底层:B+树详解
    查看>>
    Mysql索引总结
    查看>>
    MySQL索引背后的数据结构及算法原理
    查看>>
    mysql经常使用命令
    查看>>
    mysql给账号授权相关功能 | 表、视图等
    查看>>
    MySQL缓存使用率超过80%的解决方法
    查看>>
    Mysql缓存调优的基本知识(附Demo)
    查看>>
    mysql网站打开慢问题排查&数据库优化
    查看>>
    mysql网络部分代码
    查看>>
    mysql自动化同步校验_Shell: 分享MySQL数据同步+主从复制自动化脚本_20190313_七侠镇莫尛貝...
    查看>>
    mysql自增id超大问题查询
    查看>>
    MySQL自带information_schema数据库使用
    查看>>
    MySQL获取分组后的TOP 1和TOP N记录
    查看>>
    MySQL蜜罐反制获取攻击者信息
    查看>>
    Mysql表创建外键报错
    查看>>
    mysql表格调取数据库信息_MySQL™ 参考手册(获取有关数据库和表的信息)
    查看>>
    MySQL视图
    查看>>
    mysql视图建立MERGE算法和TEMPTABLE算法的区别(效率与表锁定问题)
    查看>>