Home

Java CAS原理分析

在java.util.concurrent的许多类中, 例如Semaphore, ConcurrentLinkedQueue, 都提供了比Synchronized(内置锁)机制更高的性能和可伸缩性, 而这种性能提升的主要来源是:原子变量和非阻塞的同步机制. - «java并发编程实战» , 而原子变量的更新的主要依赖于CAS, 即CompareAndSwap, 比较并交换, 一种非阻塞的同步机制. 硬件方面 这是针对多处理器操作而设计的处理器中提供的一些特殊指令, 用于管理对共享数据的并发访问, 这些指令常用的是: 测试并设置(Test-and-Set) 获取并递增(Fetch-and-Increment) 交换(Swap) 比较并交换(Compare-and-S...

Read more

Java 原子变量分析

在编码过程中, 我们难免会遇见对共享变量的读取或者更新操作, 而这些共享变量是可以被多个线程同时访问, 我们可以使用锁来保证这些操作的有序地进行串行的访问, 但是这样性能和可伸缩性将大大降低, 这就需要我们今天的主角, Java 中的原子变量. Java原子变量的主要机制 volatile保证其内部字段的可见性, 有序性. 通过CAS机器级指令实现原子性的更新操作. 如果你对CAS机制不了解, 推荐看下这篇文章Java CAS原理分析 分析源码 (AtomicInteger) public class AtomicInteger extends Number implements java.io.Serializable { private static f...

Read more

Two-Phase Termination模式

适用的情况 当想要终止正在运行的线程, 如果突然被紧急终止了, 那么这时候的实例的状态可能就会出现错误. 实现的方式 可能会被中断的线程, 轮询线程的状态或者捕获InterruptException进行处理, 利用finally{}确保线程关闭的时候维护相关状态的安全. 相关的模式 当想在执行终止处理前禁止其他处理, 可以使用Balking模式. 代码示例: 这是一个负责慢慢累加的CountUpThread”线程”类, 他会在接收到终止通知的时候, 打印最后counter的大小. package com.graphic.twoPhaseTermination; /** * @author youngxinler 19-6-4...

Read more

Thread-Per-Message模式

适用的情况 解决一个请求会花费比较长的时间, 这时候程序的主进程的控制权一直会被当前请求所占用, 其他的请求也无法进行处理. 实现的方式 在接收请求的主线程方法中, 另外开启一个线程, 让新开启的线程对该请求进行处理, 这时候, 接收请求的主线程不会被阻塞到. 相关的模式 想要节省开启线程所花费的时间, 可以使用Worker-Thread模式. 当需要返回结果的时候, 可以使用Future模式. 代码示例: Host接收请求, 然后开启新的线程进行任务的处理, (字符串输出, 为了模拟正常情况下, 进行Thread.sleep()阻塞). package com.graphic.threadPerMessage; /** ...

Read more

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...

Read more