观前提示
除了有些真的是概念,其余很多其实都可以通过重量级锁实现,只不过为了减少开销,想出了别的方法来同步
The Monitor Concept
注意它说的是一个概念,所以是一种模式,不是一类代码,前面说的 Java 所实现的 synchronized
就是一种 monitor concept
但是与之不同的是… 这还激怒了原 concept 理念者
Volatile Fields
一个轻量级的同步方案,synchronized
被称为重量同步。可以实现不用锁而同步访问的效果
先举例子后理解:常用于那些标志变量,有的线程要改变它,而有的线程要是不是查看是不是改变。这很明显要同步,但是上锁又太重了,所以用这个关键字
貌似是不同线程在 CPU 中执行的时候,那些变量在内存中的位置不会及时更新,因此就要用锁来保证别人不要更新。而这个关键字可以让更新变得敏捷,别人更新了,大家都知道
volatile 并没有原子性
虽说可以实现类似同步的效果,但是毕竟不是真同步,它不保证原子性。就像前面说的,他的机理只是让这个变量的改变不会被线程单防
对于类似
a = !a
这样的操作,本身就不是原子的,那么照样有可能出现,刚取反,就被别的线程修改了的情况所以看起来最好只用在一次修改,和一次访问,最符合的特征就是类似
flag
变量了
Final Variables
不太懂,感觉意义不大
Atomics
要知道上锁的本源是因为行为的非原子性,如果有些函数内就会实现一个动作会导致 race condition,那么与其上锁,可以考虑使用 Atomic*
相关类
LongAdder
主要场景是:超多线程打算对同一个字段做加法。如果用锁或者原子类,都换产生这边等那边,性能大大浪费。而用这个就是快了,原理不知道没关系
其实原理就是给每个线程都维护一个属于自己的变量,这样不会竞争,然后最后加起来就行了,就是一个加法结合律
Deadlocks
就是介绍了一下,没说什么,并且 Java 没有方法避免,只能通过程序员避免
Thread-Local Variables
public static final ThreadLocal<SimpleDateFormat> dateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
String dateStamp = dateFormat.get().format(new Date());
那和普通局部变量有什么区别呢
貌似就是局部变量太局部了,ThreadLocal 就像是一个银行,每个用户之间的账户都是隔离的,但是银行是中心化的,但是局部变量是去中心的?
Why the stop and suspend Methods Are Deprecated
以后再看