博客
关于我
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锁机制,行锁表锁
    查看>>
    MySQL锁表问题排查
    查看>>
    Mysql锁(1):锁概述和全局锁的介绍
    查看>>
    Mysql锁(2):表级锁
    查看>>
    MySQL锁,锁的到底是什么?
    查看>>
    MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
    查看>>
    Mysql错误2003 -Can't connect toMySQL server on 'localhost'(10061)解决办法
    查看>>
    MySQL错误提示mysql Statement violates GTID consistency
    查看>>
    mysql错误:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
    查看>>
    mysql长事务
    查看>>
    mysql问题记录
    查看>>
    mysql间隙锁
    查看>>
    MySQL集群解决方案(1):MySQL数据库的集群方案
    查看>>
    MySQL集群解决方案(2):主从复制架构
    查看>>
    MySQL集群解决方案(3):MyCat中间件
    查看>>
    MySQL集群解决方案(4):负载均衡
    查看>>
    MySQL集群解决方案(5):PXC集群
    查看>>
    MySQL面试宝典
    查看>>