
java多线程编程
华山拎壶冲
不积跬步,无以至千里。。。
面试必备:https://www.jianshu.com/u/c3be0f69940b
展开
-
我画了35张图就是为了让你深入 AQS
前言谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。我们先看下AQS相关的UML图:image思维导图(高清无损 AV 画质长图.pdf 关注公众号回复 AQS 获取)image1AQS实现原理AQS中 维护了转载 2020-07-01 16:13:34 · 212 阅读 · 0 评论 -
面试问我,创建多少个线程合适?我该怎么说
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想If you can NOT explain it simply, you do NOT understand it well enoughimage为什么要使用多线程?防止并发编程出错最好的办法就是不写并发程序image既然多线程编程容易出错,为什么它还经久不衰呢?A:那还用说,肯定在某些方面有特长呗,比如你知道的【它很快,非常快】我也很赞同这个答案,但说的不够具体并发编程适用于什么场景?如果问.转载 2020-06-09 14:52:24 · 199 阅读 · 0 评论 -
java并发锁机制----ReentrantLock 原理解析
什么是AQSAQS即是AbstractQueuedSynchronizer,一个用来构建锁和同步工具的框架,包括常用的ReentrantLock、CountDownLatch、Semaphore等。AQS没有锁之类的概念,它有个state变量,是个int类型,在不同场合有着不同含义。本文研究的是锁,为了好理解,姑且先把state当成锁。AQS围绕state提供两种基本操作“获取”和“释...原创 2019-06-11 19:14:25 · 390 阅读 · 0 评论 -
synchronized实现原理
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁是括号里面的对象当一个线程访问同步代码块时,它首先是需要得到锁才能执行同步代码,当退出...原创 2019-06-12 11:03:51 · 214 阅读 · 0 评论 -
Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性
Java多线程编程-(1)-线程安全和锁Synchronized概念基本介绍了进程和线程的区别、实现多线程的两种方式、线程安全的概念以及如何使用Synchronized实现线程安全,下边介绍一下关于Synchronized的其他基本特性。一、Synchronized锁重入(1)关键字Synchronized拥有锁重入的功能,也就是在使用Synchronized的时候,当一个线程得到一...转载 2019-06-12 11:29:51 · 143 阅读 · 0 评论 -
Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用
上一篇:Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性ThreadLocal简介我们通过上两篇的学习,我们已经知道了变量值的共享可以使用public static变量的形式,所有的线程都使用同一个被public static修饰的变量。那么如果我们想实现每一个线程都有自己的共享变量该如何解决哪?JDK提供的ThreadLocal正是为了解决这样的问...转载 2019-06-12 11:52:11 · 168 阅读 · 0 评论 -
J.U.C之AQS:源码解析独占式同步实现
获取独占式同步状态整体流程图入口函数 public final void acquire(int arg) { /* *子类实现tryAcquire能否获取的独占式同步状态 *如果返回true则获取同步状态成功方法直接返回 *如果返回false则获取同步状态失败进入if语句 */ ...原创 2019-06-18 11:40:03 · 261 阅读 · 0 评论 -
Thread类中的方法:join()、sleep()、yield()之间的区别
1. Thread类中的常用方法简介首先,先看一下Thread类中的常见方法:最主要的是区分其中join()、sleep()、yield()的用法区别2. Join()方法Thread的非静态方法join()让一个线程等待另外一个线程完成才继续执行。如果线程A执行体中调用B线程的join()方法,则A线程将会被阻塞,直到B线程执行完为止,A才能得以继续执行。如下图:...转载 2019-07-02 18:14:19 · 875 阅读 · 0 评论 -
java并发锁机制----ReentrantLock 原理解析之Condition实现原理
1、java.util.concurrent.locks.Condition接口一览:void await() throws InterruptedException;void awaitUninterruptibly();long awaitNanos(long nanosTimeout) throws InterruptedException;boolean await(lo...转载 2019-06-28 18:03:10 · 1554 阅读 · 0 评论 -
java并发锁机制----ReentrantReadWriteLock读写锁源码分析
使用示例下面这个例子非常实用:// 这是一个关于缓存操作的故事class CachedData { Object data; volatile boolean cacheValid; // 读写锁实例 final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void pr...转载 2019-07-05 17:08:35 · 434 阅读 · 0 评论 -
同步synchronized与ReentrantLock简单应用及分析
在多线程的应用中,两个或者两个以上的线程需要共享同一个资源。如果多个线程同时在访问同一资源时,都做出了相应的操作来获取自己想要的资源,在这种情况下很难保证获取资源的准确性和唯一性,相互之间产生冲突,通常称之为竞争条件。关于竞争条件的理解:比如火车买票,火车票(数量、座位号等等)是一定的,但卖火车票的窗口是不确定的到处都有,每个窗口就相当于一个线程,这么多的线程共用所有的火车票这个资源;如果在某...转载 2019-06-11 14:55:51 · 416 阅读 · 0 评论 -
interrupt()和线程终止方式
1. interrupt()说明在介绍终止线程的方式之前,有必要先对interrupt()进行了解。关于interrupt(),java的djk文档描述如下:http://docs.oracle.com/javase/7/docs/api/Interrupts this thread.Unless the current thread is interrupting itself, ...原创 2019-06-11 10:13:07 · 786 阅读 · 0 评论 -
Java多线程编程-(11)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力
一、背景对于Java来说我们知道,Java代码首先会编译成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上进行执行。Java中所使用的并发机制依赖于JVM的实现和CPU的指令。下边我们对常见的实现同步的两个关键字volatile和synchronized进行底层原理的分析,分析之余我们就会了解到JVM在对锁的优化所做的事情,这样的话我们...原创 2019-06-12 18:13:01 · 204 阅读 · 0 评论 -
Java多线程编程-(4)-线程间通信机制的介绍与使用(阻塞队列实现)
上一篇:Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用线程间通信简介我们知道线程是操作系统中独立的个体,但是这个单独的个体之间没有一种特殊的处理方式使之成为一个整体,线程之间没有任何交流和沟通的话,他就是一个个单独的个体,不足以形成一个强大的交互性较强的整体。为了提高CPU的利用率和各线程之间相互协作,Java的一种实现线程间通信的机制是:wait/not...转载 2019-06-12 18:26:14 · 417 阅读 · 0 评论 -
Java多线程编程-(1)-线程安全和锁Synchronized概念
一、进程与线程的概念(1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程。在未配置 OS 的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完后,才允许另一个程序执行;在多道程序环境下,则允许多个程序并发执行。程序的这两种执行方式间有着显著的不同。也正是程序并发执行时的这种特征,才导致了在操作系统中引入进程的概念。自从在 20 世纪 60 年代人...转载 2019-06-06 11:00:23 · 128 阅读 · 0 评论 -
Synchronized对象锁和类锁区别
先说明几个概念。java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这个锁...原创 2019-06-06 15:33:43 · 399 阅读 · 0 评论 -
J.U.C之AQS:AQS概述和使用
AQS是什么AQS是AbstractQueuedSynchronizer的缩写,翻译过来就是"同步器",AbstractQueuedSynchronizer是一个抽象类,Java并包里大部分并发工具类都将其作为核心基础构件,比如可重入锁ReentrantLock, 信号量Semaphore基于各自的特点来调用AQS提供的基础能力方法实现多线程交互。例如:锁同步(synchronized)和锁等...转载 2019-06-19 09:54:06 · 338 阅读 · 0 评论 -
happens-before概要俗解
学习Java并发,到后面总会接触到happens-before偏序关系。初接触玩意儿简直就是不知所云,下面是经过一段时间折腾后个人对此的一点浅薄理解,希望对初接触的人有帮助。如有不正确之处,欢迎指正。synchronized、大部分锁,众所周知的一个功能就是使多个线程互斥/串行的(共享锁允许多个线程同时访问,如读锁)访问临界区,但他们的第二个功能 —— 保证变量的可见性 —— 常被遗忘。为...原创 2019-06-10 11:13:02 · 271 阅读 · 0 评论 -
java 线程的几种状态
java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明:NEW状态是指线程刚创建, 尚未启动RUNNABLE状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等BLOCKED这个状态下, 是在多个线程有同步操...转载 2019-06-10 15:01:00 · 995 阅读 · 0 评论 -
线程等待与唤醒实测讲解
1.wait(), notify(), notifyAll()等方法介绍在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll...转载 2019-06-10 16:05:04 · 249 阅读 · 0 评论 -
J.U.C之AQS:源码解析共享式同步实现
获取共享式同步状态总体图入口函数public final void acquireShared(int arg) { /* *子类实现tryAcquireShared能否获取的共享式同步状态 *如果返回>=0则获取同步状态成功方法直接返回 *如果返回< 0则获取同步状态失败进入if语句 ...转载 2019-06-20 20:28:40 · 199 阅读 · 0 评论 -
volatile关键字解析
转载自:http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是...转载 2019-06-12 17:58:08 · 170 阅读 · 0 评论