![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java多线程
因为爱,所以喜欢
一生很长,要和有趣的人在一起
展开
-
队列同步器AbstractQueuedSynchronizer简介
Lock接口锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时 访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在Lock接 口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增 了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功 能,...原创 2019-08-19 12:11:00 · 694 阅读 · 0 评论 -
FutureTask详解
Future接口和实现Future接口的FutureTask类,代表异步计算的结果。FutureTask简介FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给 Executor执行,也可以由调用线程直接执行(FutureTask.run())。根据FutureTask.run()方法被执行 的时机,FutureTask可以处于下...原创 2019-08-20 22:25:35 · 6181 阅读 · 0 评论 -
最形象的CAS
@[我们先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次。最终输出的count结果一定是200吗?因为这段代码是非线程安全的,所以最终的自增结果很可能会小于200。我们再加上synchronized同步锁,再来看一下。加了同步锁之后,count自增的操作变成了原子性操作,所以最终输出一定是count=200,代码实现了线程安全。虽然synchronize...转载 2019-08-12 11:03:51 · 115 阅读 · 0 评论 -
Java中如何优雅正确的终止线程
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 ...转载 2019-08-16 12:53:25 · 215 阅读 · 0 评论 -
Java 优雅的终止线程
Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。《Java多线程模式》中有一种叫Two-Phase Termination(两步终止)的模式可以优雅的终止线程。首先在线程中设置一个标志位:private volatile boolean shutdownRequested =&nb...转载 2019-08-16 13:12:31 · 140 阅读 · 0 评论 -
阻塞队列(BlockingQueue)
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就...原创 2019-08-18 12:25:39 · 516 阅读 · 0 评论 -
SimpleDateFormat非线程安全测试及修改
1.出现异常package demo4.jd;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class MyThread extends Thread { private SimpleDateFormat sdf; priva...原创 2019-08-27 09:24:03 · 131 阅读 · 0 评论 -
浅谈SimpleDateFormat的线程安全问题
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 ...原创 2019-08-27 11:01:47 · 226 阅读 · 0 评论 -
InheritableThreadLocal
InheritableThreadLocal 可以让子线程从父线程中取得值值继承package ext;import java.util.Date;public class InheritableThreadLocalExt extends InheritableThreadLocal { @Override protected Object initialV...原创 2019-08-27 11:02:13 · 109 阅读 · 0 评论 -
FutureTask获取线程返回值原理、源码分析
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 ...转载 2019-08-20 17:55:09 · 810 阅读 · 0 评论 -
ScheduledThreadPoolExecutor详解
ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后运 行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能与Timer类似,但 ScheduledThreadPoolExecutor功能更强大、更灵活。Timer对应的是单个后台线程,而 ScheduledThreadPoolExecutor...原创 2019-08-20 13:27:37 · 31112 阅读 · 3 评论 -
Java中join()方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //调用join方法,等待线程t执行完毕t.join(1000); //等待 t 线程,等待时间是1000毫秒。下面是一段JDK中的代码: public final...原创 2019-08-19 13:33:47 · 851 阅读 · 0 评论 -
LockSupport工具
当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功 能,而LockSupport也成为构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread) 方法来唤醒一个被阻塞的线程。Park有停车的意思...原创 2019-08-19 17:00:50 · 537 阅读 · 0 评论 -
等待多线程完成的CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作。假如有这样一个需求:我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多 线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完 成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用 join()方法,如代码清单8-1所示。代码清单8-1...原创 2019-08-19 17:54:25 · 185 阅读 · 0 评论 -
同步屏障CyclicBarrier
CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数 量,每个线程调用awai...原创 2019-08-20 00:14:16 · 288 阅读 · 0 评论 -
Semaphore(信号量)
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流 量的红绿灯。比如××马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶 入××马路,但是如果前一...原创 2019-08-20 00:49:02 · 376 阅读 · 0 评论 -
Java中的线程池
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的...原创 2019-08-20 11:06:28 · 203 阅读 · 0 评论 -
Executor框架
在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开 来。工作单元包括Runnable和Callable,而执行...原创 2019-08-20 12:22:19 · 329 阅读 · 0 评论 -
ThreadPoolExecutor详解
Executor框架最核心的类是ThreadPoolExecutor,它是线程池的实现类,主要由下列4个组件构成。·corePool:核心线程池的大小。·maximumPool:最大线程池的大小。·BlockingQueue:用来暂时保存任务的工作队列。·RejectedExecutionHandler:当ThreadPoolExecutor已经关闭或ThreadPoolExecutor...原创 2019-08-20 12:54:51 · 285 阅读 · 0 评论 -
流利说面试 & 用两个栈实现队列 & 237. 删除链表中的节点 & 119. 杨辉三角 II & 118. 杨辉三角 & 64. 最小路径和
面试官当时问我的是上面代码有问题没,我回答说会报错,又追问我是编译时报错还是运行时报错,我回答的是运行时会报错,又追问道回报什么类型的错误,我回答的是类型转换异常(因为map 调用get方法时,如果没获取到会返回值为null,把一个null类型的赋值给基本类型就会报错),然而经过现实运行,结果证明我的猜错是wrong。。。135. 分发糖果老师想给孩子们分发糖果,...原创 2019-09-14 17:11:35 · 312 阅读 · 0 评论