0%

Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。

Synchronized的作用主要有三个:

  1. 确保线程互斥的访问同步代码
  2. 保证共享变量的修改能够及时可见
  3. 有效解决重排序问题(synchronized 不能防止指令重排序,但满足 as-if-serial 语义)

从语法上讲,Synchronized总共有三种用法:

  1. 修饰普通方法
  2. 修饰静态方法
  3. 修饰代码块

Synchronized在JDK1.6后的优化,主要包括了自适应自旋锁、锁消除、锁粗化、轻量级锁和偏向锁

阅读全文 »

CAS (Compare-And-Swap) 是一种无锁的非阻塞算法的实现。CAS 包含了 3 个操作数:1. 需要读写的内存值 V,2. 进行比较的值 A 3. 拟写入的新值 B。当且仅当 V 的值等于 A 时,CAS 通过原子方式用新值 B 来更新 V 的值,否则不会执行任何操作。

CAS也是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。

Java中 AtomicBoolean、AtomicInteger、AtomicLong 和 AtomicReference 的实例各自提供对相应类型单个变量的访问和更新。每个类也为该类型提供适当的实用工具方法。

AtomicIntegerArray、AtomicLongArray 和 AtomicReferenceArray 类进一步扩展了原子操作,对这些类型的数组提供了支持。这些类在为其数组元素提供 volatile 访问语义方 面也引人注目,这对于普通数组来说是不受支持的。

阅读全文 »

Java 提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。可以将 volatile 看做一个轻量级的锁,它可以保证线程可见性,防止指令重排序,但不能保证变量状态的“原子性操作”

保证线程可见性

在下面的例子中,如果不加volatile关键字修饰flag变量,程序不会输出“end”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestVolatile {

private static volatile boolean flag = true;

public static void main(String[] args) throws InterruptedException {
new Thread(()-> {
while (flag) {
//do sth
}
System.out.println("end");
}, "server").start();

Thread.sleep(1000);

flag = false;
}
}
阅读全文 »