Java CAS原理分析
在java.util.concurrent的许多类中, 例如Semaphore, ConcurrentLinkedQueue, 都提供了比Synchronized(内置锁)机制更高的性能和可伸缩性, 而这种性能提升的主要来源是:原子变量和非阻塞的同步机制. - «java并发编程实战» , 而原子变量的更新的主要依赖于CAS, 即CompareAndSwap, 比较并交换, 一种非阻塞的同步机制.
硬件方面
这是针对多处理器操作而设计的处理器中提供的一些特殊指令, 用于管理对共享数据的并发访问, 这些指令常用的是:
测试并设置(Test-and-Set)
获取并递增(Fetch-and-Increment)
交换(Swap)
比较并交换(Compare-and-S...
Java 原子变量分析
在编码过程中, 我们难免会遇见对共享变量的读取或者更新操作, 而这些共享变量是可以被多个线程同时访问, 我们可以使用锁来保证这些操作的有序地进行串行的访问, 但是这样性能和可伸缩性将大大降低, 这就需要我们今天的主角, Java
中的原子变量.
Java原子变量的主要机制
volatile保证其内部字段的可见性, 有序性.
通过CAS机器级指令实现原子性的更新操作.
如果你对CAS机制不了解, 推荐看下这篇文章Java CAS原理分析
分析源码 (AtomicInteger)
public class AtomicInteger extends Number implements java.io.Serializable {
private static f...
Two-Phase Termination模式
适用的情况
当想要终止正在运行的线程, 如果突然被紧急终止了, 那么这时候的实例的状态可能就会出现错误.
实现的方式
可能会被中断的线程, 轮询线程的状态或者捕获InterruptException进行处理, 利用finally{}确保线程关闭的时候维护相关状态的安全.
相关的模式
当想在执行终止处理前禁止其他处理, 可以使用Balking模式.
代码示例:
这是一个负责慢慢累加的CountUpThread”线程”类, 他会在接收到终止通知的时候, 打印最后counter的大小.
package com.graphic.twoPhaseTermination;
/**
* @author youngxinler 19-6-4...
Thread-Per-Message模式
适用的情况
解决一个请求会花费比较长的时间, 这时候程序的主进程的控制权一直会被当前请求所占用, 其他的请求也无法进行处理.
实现的方式
在接收请求的主线程方法中, 另外开启一个线程, 让新开启的线程对该请求进行处理, 这时候, 接收请求的主线程不会被阻塞到.
相关的模式
想要节省开启线程所花费的时间, 可以使用Worker-Thread模式.
当需要返回结果的时候, 可以使用Future模式.
代码示例:
Host接收请求, 然后开启新的线程进行任务的处理, (字符串输出, 为了模拟正常情况下, 进行Thread.sleep()阻塞).
package com.graphic.threadPerMessage;
/**
...
Thread-Local Storage模式
别名
Per-Thread Attribute
Thread-Specific Data
Thread-Specific Field
Thread-Local Storage
适用的情况
使每个线程拥有独立的上下文实例. 从而避免了多线程之间的实例竞争.
实现的方式
java.lang.ThreadLocal来保管相关的所有线程的单独实例.
代码示例:
Log利用ThreadLocal保存着所有线程单独的TSLog对象, 然后每个线程通过TSLog打印各自的日志到各自本地的日志文件.
package com.graphic.threadSpecificStorage;
import j...
43 post articles, 9 pages.