并发编程3

116 阅读1分钟

加锁机制

用锁保护状态: 在访问状态的所有地方都要持有同一个锁 活跃性与性能: 执行时间较长的计算或者无法快速完成的操作时一定不要持有锁

要保持状态的一致性, 就需要在单个原子操作中更新所有相关的状态变量

内置锁

java提供了synchronized关键字作为内置锁

synchronized(lock) {
    //访问共享状态
}

java中欸欸一个类都可以作为锁对象, 内置锁也是互斥锁,字面意思互相排斥保证了共享变量同一时刻只有一个线程可以访问. 为了减少开销和避免死锁java提供了一种可以使获取锁对象的类重新获取锁的机制,也就是可重入锁.

重入锁

当某个线程七个球一个由其他线程持有的锁时,发出的请求就会阻塞.然而由于内置锁是可重入的,因此如果某个线程视图获取一个已经由他自己持有的锁,那么这个请求就会成功. 那么可重入锁是如何实现的呢?

为每个锁关联一个获取技术值和一个所属者线程,当计数值为0时这个锁就被认为是没有被任何线程占有.当线程请求一个未被持有的锁时,jvm将记下来锁的持有者并将获取值置为1,如果同一个线程再次获取这个锁,计数值递增,而当线程退出代码块时计数值对应递减,当计数值为0时这个锁被释放