多线程
文章平均质量分 54
龙门之上
一个程序员
展开
-
多线程交替打印 condition和semaphore
经常被问 多个线程如何交替打印?下面来两种方式Rentrantlock 的 conditionclass ShareResource { private int number = 1;// 控制线程谁开始运行 private Lock lock = new ReentrantLock(); private Condition c1 = lock.newCondition(); private Condition c2 = lock.newCondition();原创 2021-03-20 16:37:15 · 267 阅读 · 2 评论 -
CyclicBarrier(循环栅栏)理解
CyclicBarrier使用最简单使用public class CyclicBarrierTest1 { static CyclicBarrier c = new CyclicBarrier(7,()->{ System.out.println("集齐七龙珠 召唤神龙"); }); public static void main(String[] args) { for (int i = 0; i < 7; i++) {原创 2021-03-20 14:58:45 · 201 阅读 · 0 评论 -
thread 中的interrupt到底是什么意思?
来源在AQS中非常费解的看到段代码 public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt();} static void selfInterrupt() { Thread.currentThread().interrupt();}自然而然就原创 2021-03-19 18:18:04 · 574 阅读 · 0 评论 -
ThreadLocal为什么会导致内存溢出?
解释就是可以看到 一般定义的 static threadLocal在栈中,但是 每个线程是有一个ThreadLocalMap的。所以虽然 在entry中 Threadlocal是一个弱引用,但是只是相对于 static threadLocal是,而每个线程自己的map却是强引用着 entry的。所以 线程一直没被销毁 ,对象就不会被垃圾回收从而导致内存泄漏https://zhuanlan.zhihu.com/p/102571059由于Thread中包含变量ThreadLocalMap,因此Threa原创 2021-03-12 10:16:27 · 364 阅读 · 0 评论 -
java多线程之Condition分析
在synchronize体系中,任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式。Condition的 wait(),sigin(),siginall()对应着wait()、notify()原创 2020-08-26 19:53:11 · 312 阅读 · 0 评论 -
java并发编程之ReentranReadWriteLock分析
上一篇文章讲了 ReentrantLock的实现,这片文章继续深入 讲讲ReentrantReadWritrLock的实现首先回想ReentrantLock中自定义同步器的实现,同步状态(state)表示锁被一个线程重复获取的次数。同样ReentranReadWriteLock也用state来维护维护多个读线程和一个写线程的状态.那么是怎么用一个int变量来维护两种锁的状态呢?答案是 :“按位切割使用”这个变量,读写锁将变量切分成了两个部分,高16位表示读,低16位表示写 。具体如下图:那么读写锁是如原创 2020-08-26 14:11:35 · 214 阅读 · 0 评论 -
java并发编程之ReentrantLock分析
了解完AQS中 关于 独占式锁和共享锁的实现后,我们再看ReentrantLock就会简单很多,首先ReentrantLock中有的锁分为公平锁和非公平锁实现,这两种都是独占锁。默认是使用非公平锁public ReentrantLock() { sync = new NonfairSync();}非公平锁的实现首先看看非公平锁的实现final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwn原创 2020-08-25 16:53:33 · 103 阅读 · 0 评论 -
java并发编程之AbstractQueuedSynchronizer之共享式同步状态获取
前面讲了AQS独占式同步状态获取与释放 下面在看看 共享式同步状态获取与释放共享式同步状态获取public final void acquireShared(int arg) { if (tryAcquireShared(arg) < 0) doAcquireShared(arg);}private void doAcquireShared(int arg) { final Node node = addWaiter(Node.SHARED);原创 2020-08-25 15:02:26 · 104 阅读 · 0 评论 -
java并发编程之AbstractQueuedSynchronizer-独占式锁的实现源码分析
java 多线程中实现锁的类型主要有两种 一种是使用synchronize第二种是自己实现Lock接口或者直接使用系统实现Lock接口的ReentantLock。下面主要讨论第二种方式:实现Lock接口下面是一个实现了Lock接口的自定义锁public class MyLock implements Lock { // 静态内部类,自定义同步器 private static class Sync extends AbstractQueuedSynchronizer {原创 2020-08-24 16:42:25 · 174 阅读 · 0 评论 -
多线程基础 如何创建多线程
实现runable接口并使用Thread.start调用//使用实现 runable接口方式 和 匿名内部类实现多线程public class HowBuildConcurrency implements Runnable { @Override public void run() { try { Thread.sleep((int)(Math.random() * 10)); } catch (InterruptedExcep原创 2020-07-31 17:53:52 · 120 阅读 · 0 评论