「javalock实现」javalock和condition
本篇文章给大家谈谈javalock实现,以及javalock和condition对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java lock内部基于什么实现的
- 2、请问java中的lock和synchronized区别是什么?
- 3、java中juc使用lock锁可以实现精准唤醒,但这样的话和单线程指定顺序执行有什么区别呢?
- 4、关于java的lock和condition
java lock内部基于什么实现的
Lock完全用Java写成,在java这个层面是无关JVM实现的。
在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,实现思路都大同小异,因此我们以ReentrantLock作为讲解切入点。
请问java中的lock和synchronized区别是什么?
lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
java中juc使用lock锁可以实现精准唤醒,但这样的话和单线程指定顺序执行有什么区别呢?
为什么用锁,肯定是多个进程同事访问,喂了确保数据一致性,才会加锁,确保同一时间只能有一个进程获取锁。你说的单线程制定顺序执行是什么意思没太懂,或许应该是多线程情况下,你制定一个队列,保证他们顺序执行。
使用lock实现精准唤醒是相对于synchronize而言的,使用synchronized锁锁定代码块或者方法,自动加锁,运行完自动释放锁;用RetrantLock重入锁,可以在方法内精确加锁解锁,也可以针对某个锁实现唤醒,注意方法内加几个锁就要解几个锁
关于java的lock和condition
1、在某些情况下,当内部锁非常不灵活时,显式锁就可以派上用场。内部条件队列有一些缺陷,每个内部锁只能有一个与之相关联的条件队列。
2、使用显式的Lock和Condition的实现类提供了一个比内部锁和条件队列更加灵活的选择。一个Condition和一个单独的Lock相关联,就像条件队列和单独的内部锁相关联一样。每个锁可以有多个等待集、中断性选择、基于时限、公平性选择等。
public interface Condition{
void await() throws InterruptedException;//相当于wait
boolean await(long time,TimeUnit unit) throws InterruptedException;
long awaitNanos(long nanosTimeout) throws InterruptedException;
void awaitUninterruptibly();
boolean awaitUntil(Date deadline) throws InterruptedException;
void signal();//相当于notify
void signalAll();//相当于notifyall
}
调用与Condition相关联的Lock的Lock.newCondition方法,可创建一个Condition.
3、有限缓存操作
@ThreadSafe
public class ConditionBoundedBufferT{
protected final Lock lock=new ReentrantLock();
private final Condition notFull=lock.newCondition();
private final Condition notEmpty=lock.newCondition();
@GuardBy("lock");
private final T[] items=(T[]) new Object[BUFFER_SIZE];
@GuardBy("lock") private int tail,head,count;
public void put(T x) throws InterruptedExceptoin{
lock.lock();
try{
while (count=items.lentgh)
notFull.await();
items[tail]=x;
if (++tail=items.length)
tail=0;
++count;
notEmpty.signal();
}
finally{lock.unlock();
}
}
public T take() throws InterruptedException{
lock.lock();
try{
while (count=items.lentgh)
notEmpty.await();
T x=items[head];
items[head]=null;
if (++head=items.length)
head=0;
--count;
notFull.signal();
return x;
}
finally{lock.unlock();
}
}
}
javalock实现的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于javalock和condition、javalock实现的信息别忘了在本站进行查找喔。
发布于:2022-12-01,除非注明,否则均为
原创文章,转载请注明出处。