并发
66.同步访问共享的可变数据
关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。
如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由一个锁保护的之前所有的修改效果。
java语言规范保证读写一个变量是原子的,除非这个变量的类型为long或者double。意味着读取一个非long或者double类型的变量,可以保证返回的值是某个线程保存在该变量中的,即使多个线程在没有同步的情况下并发地修改这个变量也是如此。
java语言规范中的内存模型,它规定了一个线程所做的变化何时以及如何变成对其他线程可见。
valatile修饰符不执行互斥访问,但它可以保证任何一个线程在读取该域的时候都将看到最近刚刚被写入的值。
增量操作符(++)不是原子的。分两个操作,先读值,再写入一个新值。
可以加上synchronized修饰符。如此就可以去掉volatile修饰符。
最佳实践是,使用类AtimicLong,比synchronized执行的更好
当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步。
未能同步共享可变数据会造成程序的活性失败和安全性失败。这样的失败是最难以调试的。
如果线程之间的交互通信,而不需要互斥,volatile修师傅就是一种可以接受的同步形式,但要正确地使用它可能需要一些技巧。
时间: 2024-10-19 16:08:16