并发编程-内置锁

内置锁

如果一个类中,存在多个原子变量,那么在对这些状态变更的时候,需要注意状态修改的原子性和一致性。
为了保证多线程之间互不影响,我们需要使用同步代码块或者在影响状态的方法上面加锁,从而保证状态的修改是线程安全的。

内置锁的形式:

synchronized (lock){
}

每一个Java对象都可以用作一个实现同步的锁,这些锁也可以称作”内置锁(Intrinsic Lock)”或者“监视器锁(Monitor Lock)”。线程在进入同步代码块之前会自动获得锁,并且在退出代码块时会自动释放锁,不论是正常执行顺序退出还是跑出异常退出代码块,都会释放锁。

Java的内置锁是一种互斥锁,这意味着最多只能有一个线程能持有这种锁。同时这也意味着,可以同时进入代码块的原子对象是“线程”,而不是调用。

可重入锁

获得了同一个“对象锁”,或者说“内置锁、监视器锁”的同一个线程可以自由进出被该对象锁锁住的代码块,可重入锁就是这个意思。

可重入锁的一个实现方式是:为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时,这个锁就被认为是没有被任何线程持有。当线程请求一个未被持有的锁时,JVM将记下锁的所有者,并且将获取计数设置为1。如果同一个线程再次进入代码块,或者再次请求同一个对象锁,那么让这个对象锁的计数值再加1。而当线程退出同步代码块时,计数器也会相应的递减。当计数值为0时,这个锁将会被释放。

用锁来保护状态

由于锁能使其保护的代码以串行形式被执行,因此可以通过锁来实现对共享状态的独占访问。

起风了,努力生存
原文地址:https://www.cnblogs.com/StivenYang/p/12858073.html