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

    你可能感兴趣的文章
    Objective-C实现二进制补码算法(附完整源码)
    查看>>
    Objective-C实现删除重复的字母字符算法(附完整源码)
    查看>>
    Objective-C实现单例模式(附完整源码)
    查看>>
    Objective-C实现单向链表的反转(附完整源码)
    查看>>
    Objective-C实现压缩文件夹(附完整源码)
    查看>>
    Objective-C实现图书借阅系统(附完整源码)
    查看>>
    Objective-C实现图片erosion operation侵蚀操作算法(附完整源码)
    查看>>
    Objective-C实现图片的放大缩小(附完整源码)
    查看>>
    Objective-C实现图片膨胀(附完整源码)
    查看>>
    Objective-C实现均值滤波(附完整源码)
    查看>>
    Objective-C实现域名转IP(附完整源码)
    查看>>
    Objective-C实现基于 LIFO的堆栈算法(附完整源码)
    查看>>
    Objective-C实现基于 LinkedList 的添加两个数字的解决方案算法(附完整源码)
    查看>>
    Objective-C实现基于事件对象实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于文件流拷贝文件(附完整源码)
    查看>>
    Objective-C实现多组输入(附完整源码)
    查看>>
    Objective-C实现字符串manacher马拉车算法(附完整源码)
    查看>>
    Objective-C实现字符串wildcard pattern matching通配符模式匹配算法(附完整源码)
    查看>>
    Objective-C实现字符串word patterns单词模式算法(附完整源码)
    查看>>
    Objective-C实现将彩色图像转换为负片算法(附完整源码)
    查看>>