JUC

16 篇文章 1 订阅
9 篇文章 0 订阅

1 Atomic : AtomicInteger
Locks : Lock, Condition, ReadWriteLock
Collections : Queue, ConcurrentMap
Executer : Future, Callable, Executor
Tools : CountDownLatch, CyclicBarrier, Semaphore

2. 原子操作
多个线程执行一个操作时,其中任何一个线程要么完全执行完此操作,要么没有执行此操作的任何步骤,那么这个操作就是原子的。出现原因: synchronized的代价比较高。

以下以AtomicInteger为例:

int addAndGet(int delta):以原子方式将给定值与当前值相加。 实际上就是等于线程安全版本的i =i+delta操作。
boolean compareAndSet(int expect, int update):如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 如果成功就返回true,否则返回false,并且不修改原值。
int decrementAndGet():以原子方式将当前值减 1。 相当于线程安全版本的–i操作。
int getAndAdd(int delta):以原子方式将给定值与当前值相加。 相当于线程安全版本的t=i;i+=delta;return t;操作。
int getAndDecrement():以原子方式将当前值减 1。 相当于线程安全版本的i–操作。
int getAndIncrement():以原子方式将当前值加 1。 相当于线程安全版本的i++操作。
int getAndSet(int newValue):以原子方式设置为给定值,并返回旧值。 相当于线程安全版本的t=i;i=newValue;return t;操作。
int incrementAndGet():以原子方式将当前值加 1。 相当于线程安全版本的++i操作

3. 指令重排

你的程序并不能总是保证符合CPU处理的特性。
要程序的最终结果等同于它在严格的顺序化环境下的结果,那么指令的执行顺序就可能与代码的顺序不一致。

4. Happens-before法则:(Java 内存模型)

如果动作B要看到动作A的执行结果(无论A/B是否在同一个线程里面执行),那么A/B就需要满足happens-before关系。

Happens-before的几个规则:

Program order rule:同一个线程中的每个Action都happens-before于出现在其后的任何一个Action。
Monitor lock rule:对一个监视器的解锁happens-before于每一个后续对同一个监视器的加锁。

Volatile variable rule:对volatile字段的写入操作happens-before于每一个后续的同一个字段的读操作。

Thread start rule:Thread.start()的调用会happens-before于启动线程里面的动作。

Thread termination rule:Thread中的所有动作都happens-before于其他线程检查到此线程结束或者Thread.join()中返回或者Thread.isAlive()==false。
Interruption rule:一个线程A调用另一个另一个线程B的interrupt()都happens-before于线程A发现B被A中断(B抛出异常或者A检测到B的isInterrupted()或者interrupted())。
Finalizer rule:一个对象构造函数的结束happens-before与该对象的finalizer的开始
Transitivity:如果A动作happens-before于B动作,而B动作happens-before与C动作,那么A动作happens-before于C动作。
因为CPU是可以不按我们写代码的顺序执行内存的存取过程的,也就是指令会乱序或并行运行, 只有上面的happens-before所规定的情况下,才保证顺序性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值