继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

什么是线程同步?在 Java 里这样理解就对了

我就是渣哥
关注TA
已关注
手记 106
粉丝 1
获赞 3

原文来自于:https://zha-ge.cn/java/57

什么是线程同步?在 Java 里这样理解就对了

Java 线程同步这玩意,刚听见时,我脑袋里还想着是不是上学那会儿大家一起喊“一二一”走正步的那种同步节奏感。结果程序员的“同步”啊,比军训教官还要严格……

一杯咖啡,一把螺丝刀:我的线程同步初体验

话说那天,我写了个多线程小工具,想着用一堆线程刷刷地处理数据,效率蹭蹭蹭地往上窜。但人生哪有这么顺?一开始我写的代码大概长这样:

for (Item item : itemList) {
    new Thread(() -> {
        counter++;
        // ... 其他操作
    }).start();
}

代码跑起来,counter 的值有时候对,有时候不对,多次重启还不同,每天像开盲盒一样。这时候我就明白了,Java 线程的“同步”不是喊口号,而是“你动作快慢我都看着,有序来,别自作主张抢资源。”

踩坑瞬间

记得有次半夜改 bug,counter 计算就是死活不准,我还天真地以为加个 volatile 关键词就高枕无忧了。

volatile int counter = 0;

现实啪啪打脸——volatile 保证了可见性,但不保证原子性!你自以为没问题,其实线程 A 读到 10,还没来得及写回去,线程 B 一脚踩上,你的 counter 史诗级乱套。

几大典型同步坑:

  • 以为只有加锁才慢,结果丢数据更惨
  • 用 volatile 企图搞定所有问题,结果一地鸡毛
  • 错误加锁:锁了方法,却管不住该管的那一块资源

搬砖中的启发(解决之道)

老实说,解决办法说白了就三板斧:

  1. synchronized 修饰(类比大家计步走路,等前面那个同学走完下一个才能动)
    synchronized(lockObject) {
        counter++;
    }
    
  2. 用原子变量(比如 AtomicInteger,你的加法永远一口气做完,谁都插不进来)
  3. 高级场景直接上并发包,什么 CountDownLatch、ReentrantLock,舞台更大,套路更多,但核心还是——谁抢资源,谁排队。

经验启示

  • 别迷信 volatile,那只是第一步
  • 不是所有地方都需要同步,过度同步会有性能瓶颈
  • 原子类和锁各有场合,别乱用
  • 关注临界区:你要同步的,永远是那个“多线程能同时改写”的区域

总结下:
线程同步其实像生活中的排队打饭——大家都饿,但不能都挤在窗口,得排好队。Java 的同步工具就像食堂大姨那只瓢,只给一个人打饭,别的小伙伴得等着。


写到这里,突然想起那句:“任何程序员解决并发的故事,都是一部斗智斗勇的‘食堂排队史’。”饭要吃得安全,程序也要跑得放心。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP