reentrantlock

阿里巴巴_java后端面经

こ雲淡風輕ζ 提交于 2019-11-26 15:52:50
自我介绍不多说! 1 多线程有什么用? ( 发挥多核CPU的优势 防止阻塞 便于建模 ) 2 怎么检测一个线程是否持有对象监视器 ( Thread类提供了一个holdsLock(Object obj)方法, 当且仅当对象obj的监视器被某条线程持有的时候才会返回true, 注意这是一个static方法,这意味着“某条线程”指的是当前线程。 ) 3 synchronized和ReentrantLock的区别 ( ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁 ReentrantLock可以获取各种锁的信息 ReentrantLock可以灵活地实现多路通知 ) 4 volatile 关键字的作用 (保证线程对内存的可见性,但是不能保证原子性 ) 5 什么是乐观锁和悲观锁 (乐观锁: 就像他的名字一样,对事情总保持一颗乐观的心, 他认为竞争不总是发生的,因此不需要总持有锁, 用比较替换尝试去修改内存中的值。悲观锁:对安全问题持悲观的状态认为竞争总是会发生的, 对资源进行操作时,总是部分青红皂白直接上锁 ) 6 用java编写一个会导致死锁的程序 7 什么是自旋锁 ( 自旋锁,是指尝试获取锁的线程不会阻塞, 而是循环的方式不断尝试,这样的好处是减少线程的上下文切换带来的开锁, 提高性能,缺点是循环会消耗CPU。 ) 8 什么是java内存模型 ( Java

JUC之ReentrantLock

对着背影说爱祢 提交于 2019-11-26 14:32:44
JUC之ReentrantLock 文章目录 JUC之ReentrantLock 一、什么是ReentrantLock 二、ReentrantLock的实现 1、重入机制的实现 2、公平机制的实现 三、ReentrantLock的应用 一、什么是ReentrantLock ReentrantLock就是可重入锁,它主要实现了以下两种机制: 可重入,一个线程可以重复获取该锁。 公平性,它实现了公平锁与非公平锁。 前者能够解决饥饿问题,但是会耗费进百倍的性能 后者可能会造成饥饿问题,但是,性能更好。 可重入锁,它本身是一个独占锁。 二、ReentrantLock的实现 1、重入机制的实现 解决重入问题 protected final boolean tryAcquire ( int acquires ) { final Thread current = Thread . currentThread ( ) ; int c = getState ( ) ; //计数为0,无需解决重入问题,直接CAS获取 if ( c == 0 ) { if ( ! hasQueuedPredecessors ( ) && compareAndSetState ( 0 , acquires ) ) { setExclusiveOwnerThread ( current ) ; return true ;

Why use a ReentrantLock if one can use synchronized(this)?

為{幸葍}努か 提交于 2019-11-26 10:58:59
I'm trying to understand what makes the lock in concurrency so important if one can use synchronized (this) . In the dummy code below, I can do either: synchronized the entire method or synchronize the vulnerable area ( synchronized(this){...} ) OR lock the vulnerable code area with a ReentrantLock. Code: private final ReentrantLock lock = new ReentrantLock(); private static List<Integer> ints; public Integer getResult(String name) { . . . lock.lock(); try { if (ints.size()==3) { ints=null; return -9; } for (int x=0; x<ints.size(); x++) { System.out.println("["+name+"] "+x+"/"+ints.size()+".

ReentrantLock

左心房为你撑大大i 提交于 2019-11-26 04:20:27
参考: https://www.cnblogs.com/takumicx/p/9338983.html ReentrantLock可重入锁:jdk中独占锁的实现除了使用关键字 synchronized 外,还可以使用 ReentrantLock 。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。 1、 ReentrantLock和synchronized都是 独占锁 ,只允许线程互斥的访问临界区。但是实现上两者不同:synchronized加锁解锁的过程是 隐式 的,用户不用手动操作,优点是操作简单,但显得不够灵活。一般并发场景使用synchronized的就够了;ReentrantLock需要 手动加锁和解锁 ,且解锁的操作尽量要放在finally代码块中,保证线程正确释放锁。ReentrantLock操作较为复杂,但是因为可以手动控制加锁和解锁过程,在复杂的并发场景中能派上用场。 2、 ReentrantLock和synchronized都是可重入的。synchronized因为可重入因此可以放在被递归执行的方法上,且不用担心线程最后能否正确释放锁;而

Why use a ReentrantLock if one can use synchronized(this)?

淺唱寂寞╮ 提交于 2019-11-26 02:15:33
问题 I\'m trying to understand what makes the lock in concurrency so important if one can use synchronized (this) . In the dummy code below, I can do either: synchronized the entire method or synchronize the vulnerable area ( synchronized(this){...} ) OR lock the vulnerable code area with a ReentrantLock. Code: private final ReentrantLock lock = new ReentrantLock(); private static List<Integer> ints; public Integer getResult(String name) { . . . lock.lock(); try { if (ints.size()==3) { ints=null;

java多线程,多线程加锁以及Condition类的使用

∥☆過路亽.° 提交于 2019-11-25 20:40:30
看了网上非常多的运行代码,很多都是重复的再说一件事,可能对于java老鸟来说,理解java的多线程是非常容易的事情,但是对于我这样的菜鸟来说,这个实在有点难,可能是我太菜了,网上重复的陈述对于我理解这个问题一点帮助都没有.所以这里我写下我对于这个问题的理解,目的是为了防止我忘记. 还是从代码实例开始讲起: import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; public class Main { public static void main(String[] args) throws InterruptedException { MyBlockingQueue<Integer> queue = new MyBlockingQueue<>(1); for (int i = 0; i < 10; i++) { int data = i; new Thread(() -> { try { queue.enqueue(data);