标签:对象引用 有一个 slice 请求 问题: 获得 原子性 原子变量 就是
(1)Java中的主要同步机制是关键字synchronized,它提供了一种独占的加锁方式,但“同步”这个术语还包括volatile类型的变量,显式锁以及原子变量。
(2)线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。
(3)要避免竞态条件问题,就必须在某个线程修改该变量时,通过某种方式防止其他线程使用这个变量,从而确保其他线程只能在修改操作完成之前或之后读取和修改状态,而不是在修改状态的过程中。
(4)如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题:
· 不在线程之间共享该状态变量。
· 将状态变量修改为不可变的变量。
· 在访问状态变量时使用同步。
(5)Java提供了一种内置的锁机制来支持原子性:同步代码块。
同步代码块包括两部分:一个作为这个锁的对象引用,一个作为由这个锁保护的代码块。以关键字synchronized来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象。
synchronized(lock){
//访问或修改由锁保护的共享状态
}
每个Java对象都可以用作一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时会自动释放锁,而无论是通过正常的控制路径退出,还是通过从代码块中抛出异常退出。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。
(5)Java的内置锁相当于一种互斥体,意味着最多只有一个线程能持有这种锁。
(6)由于每次只能有一个线程执行内置锁保护的代码块,因此由这个锁保护的同步代码块会以原子方式执行,多个线程在执行该代码块时也不会相互干扰。
(7)当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而由于内置锁是可重入的,因此如果某个线程试图获得一个已经由他自己持有的锁,那这个请求就会成功。
(8)
标签:对象引用 有一个 slice 请求 问题: 获得 原子性 原子变量 就是
原文地址:https://www.cnblogs.com/abbychen/p/10361629.html