并发编程
黑衣如墨剑如雪
人生在世,你只要知道两件事。一,这世上绝对存在不需要读书也很聪明,不需要努力也过得很好,甚至不需要钱就能快乐的人。二,那个人绝对不是你。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java中的线程
java程序是多线程的为什么说java程序是多线程的呢?直接看下面这个简单的main方法,粗略一看好像并没有启动其他线程,但是实际结果并非如此。package com.su.mybatis.oracle.controller;import java.lang.management.ManagementFactory;import java.lang.management.Thr...原创 2019-09-01 20:53:04 · 164 阅读 · 0 评论 -
Condition接口方法的使用
在synchronized中,我们实现等待通知机制使用的是JDK中的wait和notify,而在显示锁中,我们则是通过Condition接口中的方法来实现等待通知机制。Condition接口接口中的await与JDK中wait对应,notify则与signal对应。JDK中等待通知机制:【线程协作】Condition接口的等待机制1)、void await() throws Int...原创 2019-09-24 19:46:28 · 401 阅读 · 0 评论 -
AQS中ConditionObject(Condition接口实现)源码解析
显示锁要使用Condition接口中方法,需要调用显示锁的newCondition()方法得到一个Condition实例化对象,再通过这个对象使用接口中方法。【AQS的实现思想】Condition接口中方法最终是调用AQS中由public修饰的内部类——ConditionObject,ConditionObject是Condition的实现类,所以本篇解析的就是AQS中的Condition...原创 2019-09-26 20:37:36 · 224 阅读 · 0 评论 -
线程死锁问题
多线程时容易出现线程安全问题,其中一种解决方法是使用锁,但是加锁很可能带来另外一个线程安全问题——死锁。死锁的概念(来自百度百科)死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。死锁产生的条件(来自百度百科)1)互斥条件:指...原创 2019-09-30 20:18:51 · 195 阅读 · 0 评论 -
线程池使用
线程池(来自百度百科)一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如,线程数一般取cpu数量+2比较合适,线程数过多...原创 2019-10-02 21:36:29 · 231 阅读 · 0 评论 -
线程池submit方法源码解析
本文是线程池的submit方法的源码解析,可以先看下【线程池execute方法的源码解析】先了解下两个接口类Callable类package java.util.concurrent;public interface Callable<V> { //返回结果,如果无法执行,则抛出异常。 V call() throws Exception;}Fu...原创 2019-10-06 00:36:31 · 967 阅读 · 0 评论 -
线程池的创建
看完【线程池的使用】,线程池简单使用应该是没有问题,在这里简单看下线程池是怎么样创建的。1)、Executors类中方法,线程池创建的入口 //可缓存线程池 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VA...原创 2019-10-05 13:07:22 · 217 阅读 · 0 评论 -
线程池execute方法的源码解析
本文是线程池execute方法的源码,在此之前可以先看下【线程池的创建】。ThreadPoolExecutor中execute方法newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor的execute方法在ThreadPoolExecutor中。1)、顶层入口;package java.util.concurr...原创 2019-10-05 21:12:37 · 1567 阅读 · 2 评论 -
JDK中的ForkJoin机制
ForkJoin的原理ForkJoin的核心思想是分而治之。分而治之是指将一个大任务拆分(fork)成若干个小任务,分别计算每个小任务,得到结果,再将所有小任务的结果执行汇总(join),得到最终结果。当然,也不是说随便就能拆分的,要求小任务互相独立且与大任务形式相同。JDK为我们提供了ForkJoin机制,我们不需要考虑线程调度问题(比如:使用ForkJoinPool),也不需要考虑任务的拆...原创 2019-10-07 18:15:01 · 477 阅读 · 0 评论 -
线程池execute方法与submit方法区别
前面写了【线程池execute方法的源码解析】和【线程池submit方法源码解析】,在这里简单记下execute方法与submit方法的区别。方法传参execute方法只能传Runnable对象void execute(Runnable command);submit方法可以传Runnable对象和Callable对象<T> Future<T> subm...原创 2019-10-06 22:28:41 · 362 阅读 · 0 评论 -
ForkJoin的使用
可以先简单了解下【JDK中的ForkJoin机制】。1、使用ForkJoin来实现数组中元素排序,使用invoke方法和submit方法。package com.su.mybatis.oracle.controller;import java.util.Arrays;import java.util.Random;//import java.util.concurrent.Exe...原创 2019-10-07 19:34:34 · 260 阅读 · 0 评论 -
AQS的实现思想
AQS:AbstractQueuedSynchronizer,抽象队列同步器。前面已经解析了部分AQS的源码,这里只是简单讲述下AQS的实现思想。同步状态(state)的管理 private volatile int state; protected final int getState() { return state; } prote...原创 2019-09-27 19:56:45 · 447 阅读 · 0 评论 -
ReentrantReadWriteLock源码
ReentrantReadWriteLock是ReadWriteLock的实现类。ReentrantReadWriteLock的方法如下所示:简单解析下锁获取和锁释放的源码。可以先看下【ReentrantLock源码解析】构造方法 private final ReentrantReadWriteLock.ReadLock readerLock; p...原创 2019-09-24 19:43:30 · 138 阅读 · 0 评论 -
并发编程的基础知识
最近学习了一些并发编程的相关知识,记下笔记便于以后翻阅。什么是进程和线程?进程是操作系统进行资源分配的最小单位,其中资源包括:CPU、内存空间、磁盘IO等。进程和进程之间是相互独立的,因此,进程是系统进行资源分配和调度的独立单位。线程是操作系统能够进行运算调度的最小单位,它是比进程更小的、能独立运行的基本单位。线程必须依赖进程存在,一个进程下的所有线程共享进程的全部资源,但是线程本身除...原创 2019-09-01 20:50:09 · 167 阅读 · 0 评论 -
线程状态和常用方法
线程状态1)、新建(NEW):在jvm上new出一个Thread的实例,还没有调用start()方法;2)、运行(RUNNABLE):运行状态又分为两个状态,就绪和运行中,当CPU为线程分配时间片时,线程进入运行中状态;如果不为线程分配时间片,则进入就绪状态,等待CPU分配时间片。当然,运行中的线程调用yield()也会将线程变成就绪状态;3)、等待(WAITING):线程调用wait...原创 2019-09-02 00:09:46 · 222 阅读 · 0 评论 -
查看当前服务器线程状态
下面是使用jdk自带工具查看当前服务器线程状态1)、进入jdk的bin,在目录框中输入cmd,回车,进入DOS操作窗口2)、jps -v ,当前服务器上运行的java进程C:\Program Files (x86)\Java\jdk1.7.0_45\bin>jps -v14508 -Dosgi.requiredJavaVersion=1.5 -Dhelp.lucen...原创 2019-09-01 20:55:05 · 2290 阅读 · 0 评论 -
关键字synchronized 和volatile
前面已经说过,Java是多线程的,多个线程相互配合完成工作,必然会出现数据共享,带来并发安全问题,如果不能解决并发安全问题,那么将会带来灾难性的后果。举个例子:package com.su.mybatis.oracle.controller;public class Test { private int num = 0; public static void ma...原创 2019-09-08 19:40:16 · 163 阅读 · 0 评论 -
简单了解ThreadLocal
ThreadLocal的作用ThreadLocal也可以解决并发中的共享变量问题。但是,与synchronized是有区别的。synchronized是采用锁的机制,保证同一时刻只有一个线程进入同步代码块(代码块中对某对象进行操作)。而ThreadLocal则是为每个变量提供一个单独的副本,使每个线程访问到的变量不是同一个对象,隔离了多个线程对该变量的数据共享。例子1(int):pa...原创 2019-09-08 19:42:18 · 129 阅读 · 0 评论 -
线程协作
什么是线程协作?多个线程相互配合,完成某项工作。比如:生产者/消费者模式,A线程生产消息,B线程消费消息就是典型的线程协作。问题采用多线程技术,例如wait/notify,设计实现一个生产者/消费者的程序,对某一对象(枪膛)进行操作,其最大容量是20颗子弹,生产者是一个压入线程,它不断向枪膛中压入子弹,消费者线程是一个射出线程,不断从枪膛中射出子弹。为了解决上述问题,就不得不了解下...原创 2019-09-08 23:14:26 · 185 阅读 · 0 评论 -
简单了解原子操作(CAS)
首先,简单地了解下悲观锁和乐观锁的概念。悲观锁具有强烈的独占和排他特性。在有悲观锁的情况下,对数据进行处理,数据会处于锁定状态。前面讲到的synchronized同一时间只允许一个线程访问某块资源,其他线程处于阻塞状态,就是一个独占锁,是悲观锁中的一种。悲观锁适用于写操作比较多的场景。乐观锁对数据有更加宽松的加锁机制,允许多个线程同时访问对某块资源,一般通过版本号机制+CAS来实现...原创 2019-09-15 22:11:34 · 830 阅读 · 0 评论 -
显示锁(Lock)
虽然很多情况都可以使用synchronized进行处理,但是synchronized使用方式是先获取锁,使用后再释放,并不能适用于所有场景。于是,显示锁(Lock)应运而生。显示锁的标准用法显示锁需要进行 lock 以及 unlock 操作。标准用法如下(以ReentrantLock为例):Lock lock = new ReentrantLock();lock.lock();//...原创 2019-09-22 09:56:28 · 540 阅读 · 0 评论 -
synchronized、ReentrantLock和ReentrantReadWriteLock
简单看下不同情况下,它们的效率1、读多读少的情况(读:1000,写:30)synchronizedpackage com.su.mybatis.oracle.controller;public class Test { private static int num = 100; //锁 private static Object obj = ne...原创 2019-09-22 22:41:29 · 190 阅读 · 0 评论 -
CountDownLatch的使用
CountDownLatch的概念CountDownLatch(闭锁),它是java.util.cucurrent包下的工具类,能够保证一个(调用CountDownLatch.await()的)线程在其他线程完成各自的工作后再执行。CountDownLatch实现机制CountDownLatch内存在一个计数器字段,计数器的值是创建CountDownLatch对象时设置的,调用Coun...原创 2019-10-08 21:08:10 · 192 阅读 · 0 评论 -
ReentrantLock源码解析
上一篇说到的显示锁(Lock),并且知道显示锁比synchronized更加灵活,ReentrantLock作为Lock的实现类,这一篇看下ReentrantLock的源码。ReentrantLock类:构造方法:可以直接通过构造器创建ReentrantLock对象,公平锁和非公平锁在之后会有介绍 /**默认构造器:非公平锁*/ public Reentran...原创 2019-09-22 13:16:25 · 185 阅读 · 0 评论 -
CyclicBarrier的使用
前文讲到了CountDownLatch,本文简单了解下CyclicBarrier。CyclicBarrier的概念CyclicBarrier(循环的屏障),它也是java.util.cucurrent包下的工具类,它的作用是设置一个屏障,到来的线程都会在屏障前等待,直到线程数达到一定的值,才允许这些线程继续执行。CyclicBarrier与CyclicBarrier的区别1)、C...原创 2019-10-09 00:07:17 · 169 阅读 · 0 评论
分享