![](https://img-blog.csdnimg.cn/20200903234318946.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
java线程
文章平均质量分 95
java多线程学习总结
Just-Today
从事并学习Java中
展开
-
线程间协作的两种方式:wait、notify、notifyAll和Condition
原文地址:https://www.cnblogs.com/dolphin0520/p/3958019.html在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。然后等待原创 2020-09-07 23:48:54 · 143 阅读 · 0 评论 -
JAVA多线程和并发基础面试问答
原文地址:https://www.cnblogs.com/dolphin0520/p/3958019.html进程和线程之间有什么不同?一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。多线程编程的好处是什么?在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不原创 2020-09-07 23:37:17 · 63 阅读 · 0 评论 -
Java线程面试题 Top 45
原文地址:https://www.cnblogs.com/dolphin0520/p/3958019.html什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持。线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同原创 2020-09-07 23:11:09 · 75 阅读 · 0 评论 -
Timer和TimerTask
原文地址:https://www.cnblogs.com/dolphin0520/p/3932921.html其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:Timer timer = new Timer();timer.schedule(new TimerTask() { public void run() { System.out.println("abc")原创 2020-09-06 18:07:49 · 241 阅读 · 0 评论 -
Callable、Future和FutureTask
原文地址:https://www.cnblogs.com/dolphin0520/p/3932921.html自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。一.Callable与Runnable 先说一下java.lang.Runnable吧,它是一个接口,在它里面只声明了一个run()方法:public interface Runnable { public abstract void run();}由于run()原创 2020-09-06 17:46:36 · 108 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore
原文地址:https://www.cnblogs.com/dolphin0520/p/3932921.html一.CountDownLatch用法CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch类只提供了一个构造器:public CountDownLatch(int count) { };原创 2020-09-06 15:46:50 · 180 阅读 · 0 评论 -
线程池的使用
原文地址:https://www.cnblogs.com/dolphin0520/p/3932921.html在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。今天我们就来原创 2020-09-06 15:27:42 · 71 阅读 · 0 评论 -
阻塞队列
原文地址:https://www.cnblogs.com/dolphin0520/p/3932905.html在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的原创 2020-09-06 13:42:57 · 106 阅读 · 0 评论 -
并发容器之CopyOnWriteArrayList
原文地址:https://www.cnblogs.com/dolphin0520/p/3932905.htmlCopy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet原创 2020-09-06 13:06:23 · 123 阅读 · 0 评论 -
并发容器之ConcurrentHashMap
原文地址:https://www.cnblogs.com/dolphin0520/p/3932905.htmlJDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Has原创 2020-09-06 12:54:16 · 220 阅读 · 0 评论 -
ConcurrentModificationException异常原因和解决方法
原文地址:https://www.cnblogs.com/dolphin0520/p/3933404.html一.ConcurrentModificationException异常出现的原因先看下面这段代码:public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); lis原创 2020-09-05 15:45:55 · 12788 阅读 · 3 评论 -
同步容器
原文地址:https://www.cnblogs.com/dolphin0520/p/3933404.html一.为什么会出现同步容器?在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。List、Set、Queue接口分别继承了Collection接口,Map本身是一个接口。注意Collection和Map是一个顶层接口,而List、Set、Queue则继承了Collection接口,分别代表数组、集合和队列这三大类容器。像ArrayList、LinkedList都原创 2020-09-05 15:27:41 · 77 阅读 · 0 评论 -
深入剖析ThreadLocal
原文地址:https://www.cnblogs.com/dolphin0520/p/3920373.html一.对ThreadLocal的理解ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。我们还是先来看一个例子:class ConnectionManager {原创 2020-09-05 15:18:12 · 108 阅读 · 0 评论 -
volatile关键字解析
原文地址:https://www.cnblogs.com/dolphin0520/p/3920373.html一.内存模型的相关概念。】【‘】'’‘’‘’‘】】】】】】】】】】】]】】】】】】】】】藤谷太辅贵妇狗风格化个废人废人废=-0987654=-09897690987uighur1·1234567890-==-0987654の玩去·123456890-/*–发··1···1·0大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于原创 2020-09-05 14:58:58 · 88 阅读 · 0 评论 -
Lock
原文地址:https://www.cnblogs.com/dolphin0520/p/3920357.html一.synchronized的缺陷synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;2)线程原创 2020-09-05 11:11:14 · 73 阅读 · 1 评论 -
synchronized
原文地址:https://www.cnblogs.com/dolphin0520/p/3920357.html一.什么时候会出现线程安全问题?在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题:由于每个线程执行的过程是不可控的,所以很可能导致最终的结果与实际上的愿望相违背或者直接导致程序出错。举个简单的例子:现在有两个线程分别从网原创 2020-09-05 10:38:44 · 79 阅读 · 0 评论 -
Thread类的使用
原文地址:https://www.cnblogs.com/dolphin0520/p/3920357.html一.线程的状态在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于后面对Thread类中的方法的理解。线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked、time waiting、waiting)、消亡(dead)。当需要新起一个线程来执行某个原创 2020-09-05 10:22:54 · 309 阅读 · 0 评论 -
创建线程和进程
原文链接:http://www.cnblogs.com/dolphin0520/p/3913517.html一.Java中关于应用程序和进程相关的概念在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认为java.exe或者javaw.exe(windows下可以通过任务管理器查看)。Java采用的是单线程编程模型,即在我们自己的程序中如果没有主动创建线程的话,只会创建一个线程,通常称为主线程。但是要注意,虽然只有一个线程来执行任务,不代表JVM中只有一个线程,J原创 2020-09-04 00:10:33 · 329 阅读 · 0 评论 -
进程和线程
一、进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,拥有自己独立的地址空间。二、线程线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,也被称为轻量进程。同一进程中的多个线程有各自的调用栈,寄存器环境和线程本地存储,共享同一进程的内存空间。...原创 2020-09-04 00:00:57 · 75 阅读 · 0 评论