多线程
Liao_Xiang
这个作者很懒,什么都没留下…
展开
-
Callable接口使用demo
public class MyCallableTask implements Callable<String> { int i; public MyCallableTask(int i) { this.i = i; } @Override public String call() throws Exception { Thread.sleep(1000); return Thread.currentThr原创 2020-08-27 20:23:55 · 205 阅读 · 0 评论 -
交替打印ABC
ReentrantLock,配合Conditionpublic class PrintABC { private int signal;// 还是需要通过信号量控制abc的输出顺序 Lock lock = new ReentrantLock(); // 只有一个锁 Condition a = lock.newCondition();// 多个condition ...原创 2020-03-04 22:25:39 · 196 阅读 · 0 评论 -
CyclicBarrier
参考:J.U.C之synchronizer框架:CyclicBarrier原创 2020-02-02 20:25:25 · 103 阅读 · 0 评论 -
lock()与lockInterruptibly()的区别
lock 优先考虑获取锁,待获取锁成功后,才响应中断。lockInterruptibly 优先考虑响应中断,而不是响应锁的普通获取或重入获取。ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException。 Reentran...原创 2020-01-13 09:23:41 · 211 阅读 · 0 评论 -
CountDownLatch
一、CountDownLatch简介CountDownLatch是一个辅助同步器类,用来作计数使用,它的作用有点类似于生活中的倒数计数器,先设定一个计数初始值,当计数降到0时,将会触发一些事件,如火箭的倒数计时。初始计数值在构造CountDownLatch对象时传入,每调用一次 countDown() 方法,计数值就会减1。线程可以调用CountDownLatch的await方法进入阻塞,当...原创 2019-12-21 17:37:51 · 267 阅读 · 0 评论 -
Semaphore
简单介绍信号量,这个类的作用有点类似于“许可证”。有时,我们因为一些原因需要控制同时访问共享资源的最大线程数量,比如出于系统性能的考虑需要限流,或者共享资源是稀缺资源,我们需要有一种办法能够协调各个线程,以保证合理的使用公共资源。Semaphore维护了一个许可集,其实就是一定数量的“许可证”。当有线程想要访问共享资源时,需要先获取(acquire)的许可;如果许可不够了,线程需要一直等待,直...原创 2019-12-21 16:32:51 · 166 阅读 · 0 评论 -
ReentrantLock
在介绍AQS中,我们自定义了一个基于AQS的简单的锁,并实现了基本功能,其实JUC包的其他很多锁,都是通过类似的方式去实现了,不过功能更强大而已。下面具体的看一下ReentrantLock是怎么实现的,首先看一下它的内部类可以看到它有三个内部类:抽象内部类Sync,其他两个内部类:FairSync和NonfairSync分别继承了该抽象类,毫无疑问抽象类Sync必定是继承了AbstractQu...原创 2019-12-19 21:49:50 · 175 阅读 · 0 评论 -
AQS
简介AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面讲到AQS的同时,也得提一下Lock接口:实现了Lock接口的某些锁提供比使用synchronized方法和语句可以获得的更广泛的锁定操作。 它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition 。AQS是一...原创 2019-12-19 10:24:20 · 114 阅读 · 0 评论 -
ThreadLocal
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,那么访问这个变量的...原创 2019-12-16 20:08:51 · 140 阅读 · 0 评论 -
Volatile(二)
原理分析Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。处理器实现原子操作...原创 2019-12-16 15:26:04 · 84 阅读 · 0 评论 -
Synchronized(一)
synchronized原理synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。public class SyncTest { public static void main(String[] args) { synchronized (SyncTest.cla...原创 2019-12-15 22:50:06 · 122 阅读 · 0 评论 -
Future模式
public interface Data { String getRequest();}public class FutureData implements Data{ private RealData realData ; //标识是否已经获取到结果 private boolean isReady = false; public synchronized void setRea...原创 2019-09-10 18:36:13 · 94 阅读 · 0 评论 -
Volatile(一)
一、volatile修饰的变量的可见性public class VolatileTest extends Thread{ private boolean isRunning = true; private void setRunning(boolean isRunning){ this.isRunning = isRunning; } @Overrid...原创 2019-09-06 16:10:45 · 115 阅读 · 0 评论 -
线程的生命周期
参考文章(作者:本人秃顶程序员,侵删)在线程的生命周期中,它要经过 新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)或者结束(Terminated) 5种状态。尤其是当线程启动以后,它不可能一直"霸占"着CPU独自运行,所以CPU需要在多条线程之间切换,于是 线程状态也会多次在运行、阻塞之间切换。NewThread thread =...原创 2019-09-06 09:07:38 · 144 阅读 · 0 评论 -
线程通信、notify和notifyAll、死锁
一、while(true)轮询public class ListAdd1 { private volatile static List list = new ArrayList(); public void add(){ list.add("jack"); } public int size(){ return list.size(); } public sta...原创 2019-09-06 08:27:45 · 164 阅读 · 0 评论 -
自定义线程池
队列为有界队列的情况:public class MyTask implements Runnable { private int taskId; private String taskName; public MyTask(int taskId, String taskName){ this.taskId = taskId; this.taskName = taskName;...原创 2019-09-02 09:59:49 · 224 阅读 · 0 评论