Java并发编程
文章平均质量分 92
Mrkang1314
这个作者很懒,什么都没留下…
展开
-
Java中带返回值的线程池Future
如何获取任务执行结果Java通过ThreadPoolExecutor提供的三个submit()方法和一个FutureTask工具类来支持获得任务执行结果的需求。// 提交Runnable任务Future<?> submit(Runnable task);// 提交Callable任务<T> Future<T> submit(Callable<T> task);// 提交Runnable任务及结果引用 <T> Futur原创 2020-10-19 17:45:11 · 2668 阅读 · 0 评论 -
Semaphore如何快速实现一个限流器
信号量是由大名鼎鼎的计算机科学家迪杰斯特拉(Dijkstra)于 1965 年提出,在这之后的 15 年,信号量一直都是并发编程领域的终结者,直到 1980 年管程被提出来,我们才有了第二选择。目前几乎所有支持并发编程的语言都支持信号量机制,所以学好信号量还是很有必要的。信号量模型信号量模型可以简单概括为:一个计数器、一个等待队列、三个方法。在信号量模型里,计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问它们,这三个方法分别是:init()、down()和up()。in.原创 2020-10-15 15:22:20 · 226 阅读 · 0 评论 -
Lock和Condition隐藏在并发包里的管程
Java SDK并发包通过Lock和Condition两个接口来实现管程(管程——并发编程的万能钥匙),其中Lock用于解决互斥问题,Condition用于解决同步问题。再造管程的理由既然Java里已经存在管程的实现synchronized并且做了许多优化,为什么还需要在并发包里开发Lock和Condition。原因是synchronized申请资源的时候,如果申请不到,线程直接进入阻塞状态,而线程进入阻塞状态,啥也干不了,也释放不了线程已经占有的资源。我们希望的是,对于“不可抢占”这个条件,占用部分原创 2020-10-15 14:29:12 · 245 阅读 · 0 评论 -
管程——并发的万能钥匙
参考原文:管程——并发万能钥匙什么是管程所谓管程,指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。Java采用的是管程技术,Synchronized关键字及wait()、notify()、notifyAll()这三个方法都是管程的组成部分。管程是一种概念,任何语言都可以使用,在Java中每个加锁的对象都绑定着一个管程。MESA模型在管程的发展史上,先后出现过三种不同的管程模型,分别是:Hasen模型、Hoare模型和MESA模型,目前广泛使用的是MESA模型,并且Java管程的实现原创 2020-10-14 14:32:33 · 215 阅读 · 0 评论 -
Java多线程案例
两个线程交替运行public class WaitAndNotify { public static Object lock = new Object(); static class ThreadA implements Runnable{ @Override public void run() { synchronized (lock){ for (int i = 0; i < 5; i++)原创 2020-08-18 09:02:08 · 138 阅读 · 0 评论 -
Java并发编程——AQS(Abstract Queued Synchronizer)
AQS简介AQS是AbstractQueuedSynchronizer的简称,即抽象队列同步器;是一个用来构建锁和同步器的框架。AQS的数据结构AQS内部使用了一个volatile的变量state来作为资源的标识,同时定义了几个获取和改版state的protected方法,子类可以覆盖这些方法来实现自己的逻辑:getState();setState();compareAndSetState();这三种操作均是原子操作,其中compareAndSetState的实现依赖于Unsafe的comp原创 2020-08-17 16:52:09 · 217 阅读 · 0 评论 -
CAS算法的理解及应用
应用众所周知,Java中有许多线程安全类,比如线程安全的集合类。从Java5开始,在java.util.concurrent包下提供了大量支持高效并发访问的集合接口和实现类。如:ConcurrentMap、ConcurrentLinkedQueue等线程安全集合。引入问题那么问题来了,这些线程安全类的底层是怎么保证线程安全的,你可能会想到是不是使用同步代码锁synchronized?其实不是...原创 2018-11-22 11:13:37 · 27538 阅读 · 1 评论 -
Java中的阻塞队列
BlockingQueue 是Java.util.concurrent包下重要的数据结构,区别于普通的队列,BlockingQueue提供了线程安全的队列访问方式,并发包下很多高级同步类的实现都是基于BlockingQueue实现的,一般用于生产者-消费者模式,生产者就是往队列里添加元素的线程,消费者是从队列里拿元素的线程,BlockingQueue就是存放元素的容器。BlockingQueue的操作方法阻塞队列提供了四组不同的方法用于插入、移除、检查元素:处理方法抛出异常返回特殊值.原创 2020-08-17 10:14:55 · 158 阅读 · 0 评论 -
Java中的线程通信、线程组、未处理的线程异常
线程通信传统的线程通信假设现在系统中有两个线程,这两个线程分别代表存款者和取钱者,而系统有一种特殊的要求,系统要求存款者和取钱者不断地重复存款、取钱的动作,而且要求每当存款者将钱存入指定账户后,取钱者就立即取钱。不允许存款者和取钱者操作连续超过两次。为了实现这种功能,可以借助于Object类提供的wait()、notify()和notifyAll()三个方法,这三个方法必须由同步监视器对象来...原创 2018-11-21 17:21:10 · 324 阅读 · 0 评论 -
多线程概述
想要了解线程,就得先了解进程,因为线程依赖于进程。进程和线程所有运行中的任务通常对应一个进程(Process)。当一个程序进入内存运行时,即变成一个进程。进程是处于运行状态的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位。进程的三个特征:独立性:进程是系统中独立存在的实体,它可以拥有自己的资源,每一个进程都拥有自己私有的地址空间。在没有经过进程本身允许的情况下...原创 2018-11-19 19:15:02 · 185 阅读 · 0 评论 -
深入理解Java虚拟机(七)Java内存模型与线程
前言在多处理系统中,每个处理器都有自己的高速缓存,而他们又共享统一主存。为了使处理器内部的运算单元能够尽量被充分利用,处理器可能会对输入的代码进行乱序优化,称为指令重排顺序优化Java内存模型JMM主要目标:定义程序中各个变量的访问规则,主存与工作内存主存所有变量(共享的)都存储在主内存,这里的变量是指实例字段、静态字段和构成数组对象的元素,不同于Java编程时所说的变量(线程私有的...原创 2019-03-22 19:09:42 · 244 阅读 · 0 评论 -
Java并发编程——基本概念
同步和异步同步:对于同步调用,在这条时间轴上,会等待被调用方法的返回;异步:调用和执行不是一条时间轴,只管调用,调用完后可以继续干别的事情,至于执行交给别的线程或操作系统来执行。临界区临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但每一次只能有一个线程使用它,一旦临界区资源被占用,其他线程想要使用这个资源,就必须等待。阻塞和非阻塞通常用来性容多线程间的相互影响;...原创 2019-05-13 14:30:06 · 164 阅读 · 0 评论 -
死锁与饥饿
概念一组进程的永久阻塞,或者是竞争系统资源,或者是通信顺序不当;到目前都没有有效的方法解决,只能尽量减少和规避。单进程死锁产生条件必要条件资源的互斥使用;保持并等待;不可剥夺;充要条件环路等待(前三个条件产生的结果,必然会引起死锁);解决死锁分析之后都不适用==预防死锁:间接方法:禁止前三个条件发生,1. 互斥是资源的固有属性不能禁止;2. 禁止保持并等待...原创 2019-05-16 09:35:53 · 317 阅读 · 0 评论