![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程与并发
多线程与并发
yaoshengting
这个作者很懒,什么都没留下…
展开
-
wait() 方法的判断逻辑需要用while判断,不能用if判断,以及notify的唤醒线程的不确定性
例如,我们有一个有界队列,有生产者向队列里插入元素,有消费者从队列中获取并删除元素。如果队列满了,则要阻塞生产者,等队列不满了再添加元素;如果队列里没有元素,则要阻塞消费者,等到有元素了再进行消费。因此,当生产者向队列里放进一个元素后,或者当消费者消费了队列里的一个元素后,就可以notify被阻塞的线程。我们通过一个简单的例子来看wait()方法的判断逻辑要用while判断,而不是用if判断import java.util.ArrayList;import java.util.Lis原创 2020-08-01 16:10:36 · 792 阅读 · 0 评论 -
java的synchronized锁实现与Monitor(管程)机制
在《操作系统同步原语》 这篇文章中,介绍了操作系统在面对 进程/线程 间同步的时候,所支持的一些同步原语,其中 semaphore 信号量 和 mutex 互斥量是最重要的同步原语。 在使用基本的 mutex 进行并发控制时,需要程序员非常小心地控制 mutex 的 down 和 up 操作,否则很容易引起死锁等问题。为了更容易地编写出正确的并发程序,所以在 mutex 和 semaphore 的基础上,提出了更高层次的同步原语 monitor,管程就可以对开发者屏蔽掉这些手...原创 2020-06-28 17:56:10 · 1453 阅读 · 0 评论 -
通过ArrayBlockingQueue源码简析一个AQS和多个Condition工作机制
在学习ReentrantLock时会不会有这样的问题,为并发包中的Lock啥要支持多个等待队列?为啥ArrayBlockingQueue是一个锁,两个Condition?这里的源码不是全部的,只是通过主要源码分析消费者-生产者模型机制public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializa原创 2020-06-28 12:28:23 · 329 阅读 · 0 评论 -
Java 主线程结束与子线程结束之间的陷阱
问:Main 线程是守护线程吗?运行中的线程还能设置成守护线程吗?答:main 线程是由 java 虚拟机在启动的时候创建的非守护线程。main 方法开始执行的时候,主线程已经创建好并在运行了。对于运行中的线程,调用 Thread.setDaemon() 会抛出异常 Exception in thread "xxxx" java.lang.IllegalThreadStateExcepti...转载 2020-03-21 12:08:37 · 1153 阅读 · 0 评论 -
FutureTask
package java.util.concurrent;import java.util.concurrent.locks.LockSupport;/** * 一个可以取消的异步计算. * 该类提供了Future接口的基本实现,启动、取消一个计算,查询计算是否完成,获取计算结果。 * 只有当计算完成之后才能获取到计算结果,如果计算还没结束,调用get()方法会阻塞。 * 一...原创 2020-02-20 14:40:40 · 180 阅读 · 0 评论 -
Executor框架
Executor框架的两级调度模型 在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程,如下图。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU。 在上层,Java多线程程序通常把应用分解为若干个任务,然...原创 2020-02-19 21:30:59 · 167 阅读 · 0 评论 -
Condition接口,Lock的监视器方法接口
任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。 Condition接口提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这...原创 2020-02-16 23:35:50 · 266 阅读 · 0 评论 -
队列同步器抽象类AbstractQueuedSynchronizer(AQS)
队列同步器AbstractQueuedSynchronizer(以下简称同步器),是构建锁或者其他同步组件的基本框架,使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成获取资源的线程的排队工作。 同步器的主要使用方法是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。 在抽象方法的实现过程中对同步状态进行更改,需要使用到同步器提供的三个方法:get...原创 2020-02-16 19:15:32 · 247 阅读 · 0 评论 -
Lock接口
Lock的使用方式Lock的使用方式如下 Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }需要注意一下两点在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。 不要将获取锁的过程写在...原创 2020-02-16 17:28:49 · 239 阅读 · 0 评论 -
Java ThreadLocal线程变量
ThreadLocal ThreadLocal线程变量是一个以ThreadLocal对象为键,任意对象为值的存储结构,这个结构被附带在线程上,一个线程可以根据一个ThreadLocal对象查询到绑定到这个线程上的一个值,该值是线程私有数据,线程之间具有隔离性。验证隔离性import java.util.concurrent.TimeUnit;public class ...原创 2020-02-15 23:55:35 · 199 阅读 · 0 评论 -
Java线程间通信
使用volatile关键字如果不明白的,看Java内存模型与线程等待/通知机制等待/通知的相关方法是任意Java对象都具备的,因为这些方法被定义在所有对象的超类java.lang.Object上等待/通知机制的相关方法 方法名称 描述 notify() 通知一个在对象上等待的线程(在该线程中调用了该对象的wait()方法进入等待队列),使其从wait()...原创 2020-02-15 17:24:15 · 161 阅读 · 0 评论 -
Java线程中断与安全终止线程
线程启动线程中断public void interrupt()除非当前线程正在中断自身(通常允许这样做),否则将调用此线程的checkAccess方法,这可能会引发SecurityException。如果该线程阻塞于调用Object类的wait(),wait(long)或wait(long,int)方法或该线程的join(),join(long),join(long,int)...原创 2020-02-15 11:07:02 · 575 阅读 · 0 评论 -
Java线程状态转换
Java 语言定义了 6 种线程状态,在任意一个时间点,一个线程有且只有其中的一种状态,这 6 种状态分别如下。新建(New):创建后尚未启动的线程处于这种状态。运行(Runnable):Runnable 包括了操作系统线程状态中的 Running 和 Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着 CPU 为它分配执行时间。无限期等待(Waiting):处于这种...原创 2020-02-14 18:54:19 · 348 阅读 · 0 评论 -
线程的实现与Java的线程实现
线程的实现线程是比进程更轻量级的调度执行单位,线程的引入可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件 I/O 等),又可以独立调度(线程是 CPU 调度的基本单位)。 主流的操作系统都提供了线程实现,Java 语言则提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经执行 start() 且还未结束的 java....原创 2020-02-13 23:34:16 · 138 阅读 · 0 评论 -
Java线程安全的实现方法
互斥同步(悲观并发策略)互斥同步(Mutual Exclusion&Synchronization)是常见的一种并发正确性保障手段。同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)线程使用。而互斥是实现同步的一种手段,临界区(Critical Section)、互斥量(Mutex)和信号量(Semaphore)都是主要的互斥实现方式...原创 2020-02-13 00:24:23 · 317 阅读 · 0 评论 -
synchronized锁的实现原理及锁升级
实现原理 Java中每一个对象都可以作为锁。具体表现为以下3种形式: 普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁是synchronized括号里配置的对象 当一个线程访问同步代码块时,它首先是需要得到锁才能执行同步代码,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢?...原创 2020-02-12 20:47:20 · 737 阅读 · 1 评论 -
Java内存模型与线程
不断压榨计算机运算能力一切问题的起源:压榨计算机运算能力 计算机的运算能力非常强大,人类要最大限度的“压榨”计算机运算能力。 然而,计算机的运算速度与它的存储和通信子系统速度的差距太大, 大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。 如果不希望处理器在大部分时间里都处于等待其他资源的状态,就必须使用一些手段去把处理器的运算能力 ” ...原创 2020-02-11 14:42:23 · 165 阅读 · 0 评论