![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线程与并发
文章平均质量分 77
yanghan1222
这个作者很懒,什么都没留下…
展开
-
Java中的AQS(一)AQS简介
队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件的基础框架,它使用一个int成员表示同步状态,通过内部的FIFO队列来完成资源获取线程的排序工作。一、AQS的设计 AQS的设计是基于模板方法模式的,也就是说,使用者需要继承AQS并重写指定的方法,随后将AQS组合在自定义同步组件的实现中,并调用AQS提供的模板方法,而这些模板方法将会调用使用...原创 2018-05-09 01:01:50 · 8475 阅读 · 1 评论 -
Java中的ReentranLock
在Java多线程中,可以使用synchronized关键字来实现线程之间的同步互斥,但在JDK1.5中新增加的ReentranLock也能达到同样的效果,并且在扩展功能上也更加强大。一、使用lock方法和unlock方法实现同步 ReentranLock的lock方法用来获取锁,而调用unlock的方法是释放锁。public class Test1 { public static v...原创 2018-05-07 00:29:13 · 400 阅读 · 0 评论 -
Java中的ReentranReadWriteLock
类ReentranLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentranLock.lock方法后面的任务。这样做虽然保证了实例变量的线程安全性,但效率确是非常低下的。所以引入了一种读写锁ReentranReadWriteLock类,使用它可以加快运行效率。 读写锁表示也有两个锁,一个是读操作相关的锁,也称为共享锁;另一个是写操作相关的锁,也叫排它锁。也就是多个读...原创 2018-05-07 01:05:15 · 399 阅读 · 0 评论 -
Java中的CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作。假如,我们现在有这样一个需求,我们需要解析一个sheet中的数据,此时我们可以考虑多线程,一个线程解析一个sheet,当所有线程解析完sheet后,再进行统计。学过多线程的我们可以想到使用join方法解决。public static void main(String[] args) throws InterruptedExcept...原创 2018-05-07 11:21:29 · 115 阅读 · 0 评论 -
Java中的CyclicBarrier
CyclicBarrier的字面意思就是可循环使用的屏障。它要做的事情就是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。和CountDownLatch一样,CycliBarrier构造方法中接受一个int型的数值,代表屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。示例代...原创 2018-05-07 13:25:01 · 1625 阅读 · 0 评论 -
Java中的Semaphore
Semaphore(信号量)是用来控制访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。Semaphore可以用于做流量控制,特别是共用资源的应用场景。public static void main(String[] args) { Semaphore semaphore = new Semaphore(10); ExecutorService exec = ...原创 2018-05-07 20:22:54 · 358 阅读 · 0 评论 -
Java中的线程池
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。合理的使用线程池能够带来三个好处: 1、降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗 2、提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即运行 3、提高线程的可管理性,线程是稀缺资源,如果无限制创建,不仅会消耗资源,还会降低系统的稳定性,使用线程池...原创 2018-05-07 23:45:32 · 115 阅读 · 0 评论 -
Java内存模型与单例模式
我们直接进入正题这是双重校验锁的单例模式 private static Singleton instance; //1 public static Singleton getSingleton(){ if (instance == null){ //2 synchronized (Singleton.class){ //3...原创 2018-07-28 14:55:27 · 494 阅读 · 1 评论 -
Java内存模型中的重排序
重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。但是不能随时随地的重排序,我们可以看一个例子看待这个问题。上面三种情况,只要重排序两个操作的执行顺序,那么程序的结果就会被改变。所以 重排序需要遵守一些规则。a、编译器和处理器不会改变存在数据依赖性关系的两个操作的执行顺序b、单线程下,不能改变数据的执行结果一、数据依赖性在上面的情况中,我们...原创 2018-07-27 21:52:30 · 1930 阅读 · 0 评论 -
Java中的Fork/Join框架
Fork/Join是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 一、 Fork/Join的运行流程图 二、工作窃取算法 工作窃取算法是指某个线程从其他队列里窃取任务去执行。在处理一个大任务时,将这个大任务分成若干个小任务,放在不同的队列里,如果某...原创 2018-05-13 13:00:41 · 769 阅读 · 0 评论 -
线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体。线程间通信就是成为整体的必用方案之一。一、等待/通知机制 等待通知在现实中处处可见,比如就餐时,初始做好饭之前,服务员一直在等待,而饭一旦做好,通知服务员上餐,这就是等待/通知。 等待通知的实现使用wait方法和notify方法实现。 wait方法的作用使当前执行代码的线程等待,知道接到通知或被中断为止...原创 2018-05-06 16:50:18 · 102 阅读 · 0 评论 -
线程的同步
线程同步是为了防止多个线程访问同一个数据对象,对数据造成破坏一、线程的并行执行造成的问题:public class FanXing { private int i = 0; public static void main(String[] args) throws InterruptedException { FanXing fanXing = new FanXin...原创 2018-05-05 23:14:08 · 133 阅读 · 0 评论 -
Java中的AQS(二)同步状态的获取与释放
上一篇博客主要讲了AQS的结构。而这片博客主要针对于同步状态的获取与释放。在此之前,先看一下AQS提供的模板方法 AQS提供的模板方法基本分为3类:独占式获取与释放同步状态,共享式获取与释放同步状态和查询同步队列中的等待线程情况。一、独占式同步状态获取与释放public final void acquire(int arg) { if (!tryAcquire(...原创 2018-05-09 11:49:38 · 1569 阅读 · 0 评论 -
Java中的AQS(三)线程的阻塞和唤醒
一、线程的阻塞: 在上一篇说到,线程获取同步状态失败的线程,会构造节点并加入到同步队列的尾部,然后通过自旋的方式不断的获取同步状态,但是在自旋过程中需要判断线程是否需要阻塞,我们再一次看一下acquire方法。final boolean acquireQueued(final Node node, int arg) { boolean failed = true; t...原创 2018-05-09 16:00:13 · 3691 阅读 · 0 评论 -
Java中的Condition
一、Condition简介 任意一个Java对象,都拥有一组监视器方法(定义在Object类中),主要包括wait,notify,notifyAll方法,这些方法与synchornized关键字相配合,可以实现等待/通知模式。 Condition接口也提供了类似的Object的监视器方法,与Lock配合可以实现等待/通知模式。但是这两者在使用方式以及功能上还是有差别的。 ...原创 2018-05-09 20:17:37 · 3049 阅读 · 0 评论 -
volatile的实现原理
Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。 那volatile是如何实现可见性的呢,如果我们对volatile修饰的字段进行写操作时,CPU会做些什么事情呢。 如果将上述代码转变成汇编代码,如下: 被volatile变量修饰的共享变量进行写操作的时候...原创 2018-05-10 21:59:54 · 4830 阅读 · 0 评论 -
synchronized的实现原理
在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。 利用synchronized实现同步的基础:Java中每一个对象都可以作为锁。集体表现为以下3中形式: 1、对于普通同步方法,锁是当前实例对象 2、对于静态同步方法,锁是当前类的Class对象 3、对于同步代码块,锁是synchronized括号里配置的对象 JVM基于进...原创 2018-05-10 23:58:14 · 139 阅读 · 0 评论 -
原子操作的实现原理及CAS
原子操作就是不可被中断的一个或者一系列操作。一、处理器如何实现原子操作 处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之前的原子操作。 1、使用总线加锁 在多处理器同时对共享变量进行读改写操作时,i=1,对i进行两次自增操作。在没有使用任何同步手段时,我们期望的值时3,但是结果可能是2,因为i++不是原子性的,它的步骤如下图所示。 ...原创 2018-05-11 11:42:12 · 12231 阅读 · 6 评论 -
Java中的线程
一、进程与线程进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。二、Java线程的创建 1、继承Thread类Thread t = ...原创 2018-05-05 14:39:20 · 82 阅读 · 0 评论 -
Java中线程的简单API介绍
简单介绍一下Thread类的方法1、set/getName 设置和获取线程名字Thread t2 = new Thread(new Runnable() { @Override public void run() { for (int i=0;i<10;i++){ System.out.println(i); }...原创 2018-05-05 16:17:07 · 185 阅读 · 0 评论 -
Java内存模型中的happens-before
一、happens-before的定义①如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,且第一个操作的执行顺序在第二个操作之前②两个操作之间存在happens-before关系,并不意味着必须按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,这种重排序是合法的...原创 2018-07-28 12:49:43 · 357 阅读 · 0 评论