concurrency
ybfqsun
阳光总在风雨后
练心、静气
展开
-
java 线程6种状态、生命周期、线程启动原理
1、线程的生命周期、一个线程从创建到销毁会经历哪些过程,首先在java.lang.Thread类中有一个State有枚举标明了线程的6种状态 public enum State { NEW,//初始状态线程被创建,还没有调用start方法 RUNNABLE,//运行状态,JAVA线程把操作系统中的就绪和运行状态统称为“运行中”,调用start()方法只是在java虚拟机中运行,...原创 2019-07-23 23:23:48 · 146 阅读 · 0 评论 -
线程池常见知识
为什么要使用线程池? 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用 线程池,必须对其实现原理了如指掌。 Executo...原创 2019-09-05 23:11:57 · 148 阅读 · 0 评论 -
java 常用线程池FixedThreadPool、SingleThreadExecutor、CachedThreadPool、ScheduledThreadPool
10.1 Executor框架简介 10.1.1 Executor框架的两级调度模型 在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线 程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程 也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU。 10.1.2 Execut...原创 2019-09-03 22:53:40 · 1165 阅读 · 0 评论 -
java线程池的实现原理
本文来源于《JAVA并发编程的艺术》书 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源...原创 2019-09-02 23:18:03 · 95 阅读 · 0 评论 -
java Atomic 原子操作 juc
原子操作类 原子性这个概念,在多线程编程里是一个老生常谈的问题。 所谓的原子性表示一个或者多个操作,要么全部执行完,要么一个也不执行。不能出现成功一部分失败一部分的情 况。 在多线程中,如果多个线程同时更新一个共享变量,可能 会得到一个意料之外的值。比如 i=1 。A 线程更新 i+1 、 B 线程也更新 i+1。 通过两个线程并行操作之后可能 i 的值不等于 3。而可...原创 2019-08-31 13:53:27 · 84 阅读 · 0 评论 -
java ConcurrentHashMap的实现及原理
本文是咕泡学院的上课笔记,如果你喜欢欢迎加入 1、在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。 2、HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。 3、为了解决上述问题ConcurrentHashMap应用而生 jdk1.7采...原创 2019-08-28 01:00:30 · 570 阅读 · 0 评论 -
java Exchanger 线程间交换数据
《java并发编程的艺术》 8.4 线程间交换数据的Exchanger Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交 换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过 exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也 执行exchange方法,当两个线程都到达同步...原创 2019-08-21 23:42:23 · 151 阅读 · 0 评论 -
Java Semaphore 使用
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以 保证合理的使用公共资源。 多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流 量的红绿灯。比如××马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须 在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶 入××马路,但是如果...原创 2019-08-21 23:29:09 · 95 阅读 · 0 评论 -
ReentrantReadWriteLock使用
ReentrantReadWriteLock 下图来源《Java并发编程的艺术》一书 锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读 线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。一般情况下,读写锁的性能都会比排它锁好,因为大多数场景读是多于写的。在读多...原创 2019-08-20 23:42:35 · 131 阅读 · 0 评论 -
Condition使用及原理
synchronized notify lock/Condition 实现类似 synchronized与notify/notifyall wait Condition 示例新建3个类WaitCondition、NotifyCondition、Test package condition; import java.util.concurrent.locks.Condition; i...原创 2019-08-19 23:31:26 · 149 阅读 · 0 评论 -
ReentrantLock实现分析
ReentrantLock的实现依赖于Java同步器框架AbstractQueuedSynchronizer(本文简称之为AQS) reentrantLock是可重入锁 实现重进入 重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞,该特性的实 现需要解决以下两个问题。 1)线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再 次成功获取。 2)锁的最终释...原创 2019-08-18 22:45:02 · 71 阅读 · 0 评论 -
java volatile原理A CUP层面
作者:知乎用户 链接:https://www.zhihu.com/question/49656589/answer/117826278 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 volatile 只能保证 “可见性”,不能保证 “原子性”。 count++; 这条语句由3条指令组成: (1)将 count 的值从内存加载到 cpu 的某个寄存器r (...转载 2019-08-01 21:48:44 · 154 阅读 · 0 评论 -
java 线程的实现方式
java线程有3种实现方式 1、通过继承Thread类,复写run()方法,调用start()(该方法是一个native方法)方法启动线程,thread类是实现了Runnable接口的类 public class ExtendsThread extends Thread { @Override public void run() { System.out.pr...原创 2019-07-22 22:01:28 · 56 阅读 · 0 评论 -
java synchronized的基本原理
1、在多线程并发编中synchronized一直是元老级角色,很 多人都会称呼它为重量级锁。但是,随着 Java SE 1.6对 synchronized synchronized 进行了各种优化之后,有些情况下它就并不那么重Java SE 1.6中为了减少获得锁和释放带来的性能消耗而引入的偏向锁和轻量级锁。 synchronized的基本语法 synchronized 有三种方式来加锁,分别是...原创 2019-07-29 22:20:15 · 192 阅读 · 0 评论 -
java FutureTask
FutureTask FutureTask 的类关系图如下,它实现 RunnableFuture 接口,那么这个 RunnableFuture 接口 的作用是什么呢。 在讲解 FutureTask 之前,先看看 Callable, Future, FutureTask 它们之间的关系图,如下: public interface RunnableFuture<V> e...原创 2019-09-09 22:07:39 · 356 阅读 · 0 评论