「javalock实现」javalock和condition

博主:adminadmin 2022-12-01 06:54:05 87

本篇文章给大家谈谈javalock实现,以及javalock和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实现的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-01,除非注明,否则均为首码项目网原创文章,转载请注明出处。