Java并发编程
文章平均质量分 69
Java并发编程中常用的类、机制和模式等使用方式和实现原理的介绍,专栏中的code demo在 https://github.com/lzx2011/java-scaffold 项目中。
gary-liu
Like technology, like recording life. Since I went to a foreign company, I have to use English to quickly integrate it. WeChat Offical account: gary_foreign
展开
-
Concurrent 包结构介绍
java 中Concurrent 包下面提供了java的并发编程的一些基本工具,能够使我们更高效写出线程安全的代码,也减少了自己使用不当导致线程死锁的可能。Concurrent 包主要包括 atomic基本类型类,基于AQS各种锁的实现,线程池框架,线程安全的集合类,线程并发控制类(CountDownLatch,CyclicBarrier),future接口实现。结构Concurrent 包下面包含了 atomic 包和 locks 包,还有Concurrent 下面直接的类。atomic 包at原创 2020-11-21 17:56:45 · 1984 阅读 · 7 评论 -
java并发——锁
分类概念分类公平锁/非公平锁可重入锁排它锁/共享锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁/适应性自旋锁主要是按java中出现的一些锁的概念,下面会具体每一类在java中的具体应用底层实现分类CAS(基于cpu指令)Synchronized (对象头,monitor锁)AQS以上是只是个人感觉,每种的实现原理我的blog中都有,可以参看公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。对于ReentrantLock而言,通过构造函数指定该锁原创 2020-10-07 23:29:54 · 133 阅读 · 0 评论 -
java并发——synchronized浅析
原理部分内容可以直接看这篇文章深入理解Java并发之synchronized实现原理synchronized 用法它的修饰对象有几种:修饰一个类,其作用的范围是synchronized后面括号括起来的部分, 作用的对象是这个类的所有对象。class ClassName { public void method() { synchronized(ClassName.class) { // todo } }}修饰一个方法,被修饰的方法称为原创 2020-10-07 18:22:52 · 183 阅读 · 0 评论 -
java并发——CAS浅谈
CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作。整个AQS(抽象队列同步)同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchronized。可以说CAS是整个JUC的基石。cas实现CAS(Compare and Swap) 是利用底层硬件平台特性,实现原子性操作的算法,Java 1.5 以后 JUC(java.uti原创 2020-10-07 17:43:10 · 270 阅读 · 0 评论 -
Java多线程——获取多个线程任务执行完的时间
问题最近我在处理一批数据,用多线程来处理,我想知道大概多久能处理完。比如我先用多线程处理 100 条数据,统计下用时,然后根据总的数据量就可以大概估算出处理完这批数据要多久。使用 CountDownLatch 计时思路:用两个 CountDownLatch 倒计时锁:开始计时锁,任务结束计时锁。开始计时锁在子线程任务开始时通过 await() 阻塞所有子线程,然后在主线程中通过 CountDownL原创 2017-06-24 19:29:37 · 20709 阅读 · 2 评论 -
Java锁——死锁
死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。产生条件java 死锁产生的四个必要条件:1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用 2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。 3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资原创 2017-06-24 21:17:18 · 914 阅读 · 0 评论 -
Java多线程——守护线程
线程分类在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 作用Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。区别User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,原创 2017-02-16 02:30:29 · 889 阅读 · 0 评论 -
线程执行顺序——CountDownLatch、CyclicBarrier 、join()、线程池
本文主要围绕一个问题展开:线程执行顺序,比如某个线程在其他线程并发执行完毕后最后执行。join介绍join()是Thread类的一个方法,join()方法的作用是等待这个线程结束。t.join()方法阻塞调用此方法的线程(calling thread),直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程。join实现Join方法实现是通过wait(原创 2017-03-10 00:02:22 · 3081 阅读 · 0 评论 -
Java多线程——线程池
线程池线程池负责管理工作线程,包含一个等待执行的任务队列。线程池的任务队列是一个Runnable集合,工作线程负责从任务队列中取出并执行Runnable对象。Executor 框架便是 Java 5 中引入的,其内部使用了线程池机制,Executor 框架包括:线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callab原创 2017-03-12 22:54:27 · 1304 阅读 · 0 评论 -
线程间协作——wait、notify、notifyAll
在 Java 中,可以通过配合调用 Object 对象的 wait() 方法和 notify()方法或 notifyAll() 方法来实现线程间的通信。在线程中调用 wait() 方法,将阻塞等待其他线程的通知(其他线程调用 notify() 方法或 notifyAll() 方法),在线程中调用 notify() 方法或 notifyAll() 方法,将通知其他线程从 wait() 方法处返回。wa原创 2017-03-14 00:58:56 · 879 阅读 · 0 评论 -
Java多线程——Semaphore
SemaphoreSemaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计原创 2017-03-14 02:32:10 · 831 阅读 · 0 评论 -
Java多线程——线程
多线程编程的利弊其实我们的程序在运行的时候,CPU很多时候都是空闲的状态,因为程序不光有CPU调度,而大多数耗时的操作都在于IO上,因此要合理利用CPU的空闲时间,来提高程序的性能。多线程也会带来一些负面的东西,比如如何的解决并发带来的线程安全问题。这个问题很不好解决,一般解决线程安全常会用到同步,同步或者过多线程间上下文的切换又会带来性能的下降。进程和线程的关系进程是资源分配的基本单位,是一个程序原创 2017-03-16 21:56:44 · 782 阅读 · 0 评论 -
Java多线程——Callable、Future和FutureTask
通过Thread或Runnable创建的线程,都需要重写run方法,而run方法的返回是void的,所以使用这种方式无法获取线程执行结果。但java提供了其他类和方法来获取线程执行结果,主要的类有Callable、Future和FutureTask。CallableCallable是个泛型接口 Callable ,该接口中只有个call()方法,并且返回值也为 V,常和ExecutorService原创 2017-03-17 01:53:51 · 874 阅读 · 0 评论 -
Java多线程——生产者和消费者模式
生产者消费者模式生产者和消费者模式是一种并发设计模式,生产者消费者模式解决的是两者速率不一致而产生的阻抗不匹配,该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直原创 2017-03-18 01:42:19 · 2569 阅读 · 0 评论 -
Java多线程——volatile
volatilevolatile修饰的变量在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。Java中的volatile关键字用作Java编译器和Thread的指示符,它们不会缓存此变量的值并始终从主存中读取它。Java在Java内存模型(JMM)中引入了一些变化,它保证了从一个线程到另一个线程的变化的可见性,也就是“happen原创 2017-03-18 17:52:04 · 904 阅读 · 0 评论 -
java多线程——ThreadLocal 原理解析
ThreadLocal介绍ThreadLocal可以创建只能由同一线程读取和写入的变量。因此,即使两个线程正在执行相同的代码,并且代码具有对 ThreadLocal变量的引用,那么这两个线程不能看到对方的ThreadLocal变量。实际上ThreadLocal的值是放入了当前线程的一个ThreadLocalMap实例中,所以只能在本线程中访问,其他线程无法访问。可以创建一个指定泛型类型的Thread原创 2017-03-18 20:30:59 · 1023 阅读 · 0 评论