美文网首页
Effective Java - 同步访问共享的可变数据

Effective Java - 同步访问共享的可变数据

作者: DZQANN | 来源:发表于2022-09-11 19:49 被阅读0次

第78条 同步访问共享的可变数据

  1. 同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果
  2. 读取一个非 longdouble类型的变量,可以保证返回的值是某个线程保存在该变量中的,即使多个线程在没有同步的情况下并发地修改这个变量也是如此
  3. 不要使用Thread.stop。要在一个线程终止另一个线程,建议的做法是让第一个线程设置一个boolean域,这个域一开始为false,但是可以通过第二个线程设置为true,这样来表示第一个线程要终止自己
  4. 除非读和写操作都被同步,否则就无法保证同步会起作用
  5. 虽然 volatile 修饰符不执行互斥访问,但它可以保证任何一个线程在读取该域的时候都将看到最近刚刚被写入的值
  6. 自增操作符(++)不是原子的,如果想要使用++的效果,推荐使用AtomicLong
  7. 尽可能将可变数据限制在单个线程中
  8. 让一个线程在短时间内修改一个数据对象,然后与其他线程共享,这是可以接受的
  9. 当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步

思考

  1. 对于多线程场景,线程对共享变量的操作都是将数据拷贝到自己的工作内存操作后回写到主内存中,所以直接赋值也会造成同步延迟现象,这也是volatile关键字的功能之一
  2. longdouble都是64位的,相当于需要两次32位的操作。Java中除了longdouble以外的基本数据类型和所有引用赋值都是原子操作
  3. volatile的两个功能:
    • 会将线程的修改同步到主内存
    • 不会发生指令重排,保证命令的有序性

相关文章

  • Java中的多线程进阶篇

    这一篇主要是学习Effecttive Java并发章节的笔记。 1、同步访问共享的可变数据 如果没有同步,一个线程...

  • 第十一章 并发

    目录 同步访问共享的可变数据 避免过度同步 EXECUTORS, TASKS, STREAMS 优于线程 优先使用...

  • Effective Java-并发

    同步访问共享的可变数据 避免过度同步 executor和task优先于线程 并发工具优先于wait和notify ...

  • volatile修饰符会破坏jvm优化么

    effective java第66条,同步访问共享变量的一个例子例如 书中说虚拟机会将代码优化hoisting 而...

  • 1_基础知识_chapter03_对象的共享_3_线程封闭

    (1) 访问共享的可变数据时, 通常就需要同步(2) 为了避免同步, 可以不共享数据, 在单线程内访问拘束的话就不...

  • 线程封闭与不变性 Java并发编程实战总结

    当访问共享的可变数据时, 通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据, 就不...

  • 【JDK1.8源码学习】ThreadLcoal

    前言 线程封闭:当访问共享的可变数据时,通常需要同步。一种避免同步的方式就是不共享数据。如果仅在单线程内访问数据,...

  • Java ThreadLocal分析

    参考:ThreadLocal与WeakReference 线程封闭 当访问共享的可变数据时,通常需要使用同步;一种...

  • 线程封闭

    线程封闭 当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据...

  • 《Effective Java》读书笔记 —— 并发

    1.同步访问共享的可变数据 同步:同步不仅可以阻止一个线程看到对象处于不一致的状态之中,还可以保证进入同步方法或者...

网友评论

      本文标题:Effective Java - 同步访问共享的可变数据

      本文链接:https://www.haomeiwen.com/subject/keoqortx.html