Java并发编程
文章平均质量分 96
经海码农
不积跬步无以至千里
展开
-
浅谈JAVA线程的生命周期,以及实现线程创建的八种方式
一、java线程的生命周期1.新生状态实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了新生状态。2.运行状态:运行中状态2.1 就绪状态新生状态调用线程的start()方法,此线程进入就绪状态;等待CPU分配时间片进入运行状态,所有就绪态线程都在就绪队列中。2.2 运行状态正在执行的线程,当时间片的时间用完或...原创 2019-11-29 11:15:11 · 493 阅读 · 0 评论 -
Java并发编程总结图谱(超详细)
原创 2019-05-10 16:07:36 · 615 阅读 · 0 评论 -
Java并发编程系列学习_volatile关键字
一、volatile的简介通过Java内存模型,我们可以知道各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进行操作后何时会写到主内存中。这个时机对普通变量是没有规定的,而针对volatile修饰的变量给Java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的“可见性”...原创 2019-04-09 15:49:07 · 168 阅读 · 0 评论 -
Java并发编程系列学习_原子操作类Atomic
一、原子操作类介绍 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案。实际上,在J.U.C下的atomic包提供了一系列的操作简...原创 2019-04-09 13:56:31 · 213 阅读 · 1 评论 -
Java并发编程系列学习_并发容器ThreadLocal
ThreadLocal简介 在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到锁的线程进行阻塞等待,很显然这种方式的时间效率并不是很好。线程安全问题的核心在于多个线程会对同一个临界区共享资源进行操作,那么,如果每个线程都使用自己的“共享资源”,各自使用各自的,又互相不影...原创 2019-04-08 21:14:41 · 176 阅读 · 0 评论 -
Java并发编程系列学习_Lock锁
Lock锁和synchronized关键字锁的对比在Java并发编程中,锁可以防止多个线程同时访问共享资源,也可以使用synchronized关键字实现锁的控制。虽然它失去了像synchronize关键字隐式加锁解锁的便捷性,但是却拥有了锁获取和释放的可操作性。Lock和Synchronized的具体的区别如下表格所示: 类别 synchronized锁 Lock锁 ...原创 2019-03-26 17:35:43 · 794 阅读 · 0 评论 -
Java并发编程系列学习_Executor与线程池ThreadPoolExecutor
Executor接口介绍java.util.concurrent.Executor 与线程池有关的大部分类都是实现了该接口,在该接口中只定义了一个方法:该接口下面有两个子接口,分别为ExecutorService以及ScheduledExecutorService.接口不能被直接实例化,只是定义了规范,具体的实例化需要由下面的实现类来实现。比较常用Executors来创建线程池对象...原创 2019-03-26 22:14:45 · 223 阅读 · 0 评论 -
Java并发编程系列学习_并发容器ConcurrentHashMap
一、再续前缘 HashMap是平时常用的一种Map集合容器,但是该容器是非线程安全的,涉及到多线程的get操作会引发死循环,导致CPU的使用率达到100%,是非常危险的操作。它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线...原创 2019-03-27 14:23:23 · 242 阅读 · 0 评论 -
Java并发编程系列学习_Timer定时器&ScheduledThreadPoolExecutor任务调度器
Timer定时器 在并发编程中,有需要去定时执行某任务、延迟执行某任务或者周期性地执行某任务。最基本的手段是使用JDK中的Timer类,负责计划任务的功能,也就是在指定的时间开始执行某一个任务。但是Timer现在也不建议使用,我们在本文中主要去学习下它如何使用,实际在项目开发中,还是建议使用ScheduledThreadPoolExecutor任务调度器,在编码测试时,也发现了...原创 2019-03-28 10:23:39 · 326 阅读 · 0 评论 -
Java并发编程系列学习_Synchronized关键字
一、问题描述先看一段代码:/** * @Author: jiaqing.xu@hand-china.com * @Date: 2019-03-28 19:27 * @Description */public class SynchronizedDemo implements Runnable { private final static int count = 0;...原创 2019-03-29 11:38:53 · 154 阅读 · 0 评论 -
Java并发编程系列学习_Semaphore并发控制器&Exchanger数据交换器
Semaphore并发资源控制器的使用场景Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法出阻塞等待。当执行完业务功能后,需要通过release()方法将许可证归还,以便其他线程能够获得许可证继续执行。S...原创 2019-03-29 17:00:46 · 196 阅读 · 0 评论 -
Java并发编程系列学习_CountDownLatch倒计时器&CyclicBarrier循环栅栏
一、倒计时器CountDownLatch在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行。当然,使用线程间消息通信机制也可以完成。其实,java并发工具类中为我们提供了类似“倒计时”这样的工具类,可以十分方便的完成所说的...原创 2019-04-01 11:32:28 · 188 阅读 · 0 评论 -
Java并发编程系列学习_Future和Callable接口的使用
线程Thread对象不具有返回值的功能,如果需要取得返回值是极其不方便的。在Java1.5的并发包中使用Future与Callable使得线程支持获取执行的返回的结果。接下来我们就通过几个例子来说明这点:接口Callable与Runnable接口的区别:1)Callable接口的call方法可以有返回值,但是Runnable的接口Run方法没有返回值。在call方法执行完毕,是通过Futu...原创 2019-04-07 15:13:40 · 220 阅读 · 0 评论 -
Java并发编程系列学习_invokeAny()方法与invokeAll()方法
一、invokeAny()方法作用:取得第一个完成任务的结果值,当第一个任务执行完成后,会调用interrupt方法将其他的任务中断。在这里会出现两种情况:无 Thread.currentThread().isInterrupted() 的判断,则已经获得第一个运行的结果的值后,其他线程继续运行; 有 Thread.currentThread().isInterrupted() 的判...原创 2019-04-07 22:01:02 · 1708 阅读 · 0 评论 -
Java并发编程系列学习_并发容器CopyOnWriteArrayList
一、ArrayList线程不安全的原因ArrayList很常用,但是该集合并不是一个线程安全的集合,首先我们来看下这个集合的内部构造成员:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java....原创 2019-04-08 14:10:30 · 187 阅读 · 0 评论