Java并发基础

 

(1)Java中的主要同步机制是关键字synchronized,它提供了一种独占的加锁方式,但“同步”这个术语还包括volatile类型的变量,显式锁以及原子变量。

(2)线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。

(3)要避免竞态条件问题,就必须在某个线程修改该变量时,通过某种方式防止其他线程使用这个变量,从而确保其他线程只能在修改操作完成之前或之后读取和修改状态,而不是在修改状态的过程中。

(4)如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题:

· 不在线程之间共享该状态变量。

· 将状态变量修改为不可变的变量。

· 在访问状态变量时使用同步。

(5)Java提供了一种内置的锁机制来支持原子性:同步代码块。

同步代码块包括两部分:一个作为这个锁的对象引用,一个作为由这个锁保护的代码块。以关键字synchronized来修饰的方法就是一种横跨整个方法体的同步代码块,其中该同步代码块的锁就是方法调用所在的对象。

synchronized(lock){

//访问或修改由锁保护的共享状态

}

每个Java对象都可以用作一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时会自动释放锁,而无论是通过正常的控制路径退出,还是通过从代码块中抛出异常退出。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。

(5)Java的内置锁相当于一种互斥体,意味着最多只有一个线程能持有这种锁。

(6)由于每次只能有一个线程执行内置锁保护的代码块,因此由这个锁保护的同步代码块会以原子方式执行,多个线程在执行该代码块时也不会相互干扰。

(7)当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而由于内置锁是可重入的,因此如果某个线程试图获得一个已经由他自己持有的锁,那这个请求就会成功。

(8)

 

posted @ 2019-02-11 13:57  AbbyChen  阅读(95)  评论(0编辑  收藏  举报