JAVA多线程8月份专题
徐明曉
这个作者很懒,什么都没留下…
展开
-
【<Java中的线程池>】
Java中的线程池[1] 使用线程池的好处[2] Executor框架[3] ThreadPoolExecutor类的参数字段[4] 线程池的排队策略[6] 拒绝策略[5] 常见的阻塞队列[6] Java提供的四种线程池[7] 手写一个线程池[1] 使用线程池的好处为了降低资源消耗,提高响应速度,提高线程的可管理性,所以出现了线程池。降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗;提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能立即执行;提高线程的可管理性:线程原创 2020-08-05 11:43:34 · 167 阅读 · 0 评论 -
【< J.U.C>】
这里写目录标题【< J.U.C>】[1] AQS[2] ReentrantLock[3] ReentrantReadWriteLock[4] StampedLock[5] Semaphore[6] threadlocal[7] CountDownLatch[8] CyclicBarrier?[9] Atmoic[10] FutureTask[11] ForkJoin【< J.U.C>】[1] AQS见专题[2] ReentrantLock见专题[3] ReentrantR原创 2020-08-05 11:41:46 · 281 阅读 · 2 评论 -
【< AQS>】
【< AQS>】[1] 什么是AQS[2] LCK队列源码及其实现[3] 独占式同步状态获取[4] 共享式同步状态获取与释放[5] 独占式超时获取同步状态[1] 什么是AQSAQS 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架。AQS分为独占式同步状态获取与释放,共享式同步状态获取与释放,独占式超时获取同步状态。接下来我先简单介绍下第一种:独占式同步状态获取与释放。AQS从数据结构上说,通过一个int成员变量state来控制同步状态,内部原创 2020-08-05 11:39:05 · 172 阅读 · 0 评论 -
【< synchronized专题>】
这里写目录标题[1] synchronized 关键字?[2] synchronized 关键字使用场景[3] synchronized 内部字节码指令[4] synchronized如何保证有序性、可见性、原子性?1. 原子性2. 可见性3. 有序性[5] synchronized 关键字锁升级过程?[5] JVM 对 synchronized 的锁优化[8] synchronized 和 volatile 的区别是什么?[1] synchronized 关键字?synchronized是Java中的原创 2020-08-05 11:17:08 · 214 阅读 · 0 评论 -
【< volatile 关键字专题>】
volatile 关键字专题[1] 谈一下你对 volatile 关键字的理解?[2]Volatile如何保证可见性和有序性?1. 可见性2.有序性的[3] volatile在什么情况下可以替代锁?[1] 谈一下你对 volatile 关键字的理解?**答:**volatile 关键字是用来保证有序性和可见性的。保证了不同线程对该变量操作的内存可见性;禁止指令重排序。我们所写的代码,不一定是按照我们自己书写的顺序来执行的,编译器会做重排序,CPU 也会做重排序的,这样做是为了减少流水线阻塞,原创 2020-08-05 11:15:56 · 138 阅读 · 0 评论 -
【ReentrantLock】
ReentrantLock[1] ReentrantLock简介[2] ReentrantLock方法[3] ReentrantLock实战[4] ReentrantLock原理[11] ReentrantLock如何实现可重入锁?[12] ReentrantLock如何实现公平锁和非公平锁?[8] 条件变量Condition实现原理?[11] 谈谈 synchronized 和 ReenTrantLock 的区别?Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 s原创 2020-08-05 11:14:58 · 148 阅读 · 0 评论 -
【<多线程常用方法>】
多线程常用方法[1] start 与 run[2] sleep 与 yield[3] sleep 和 wait[4] Daemon[5] join和yield[6] wait() notify() notifyAll()[7] await() signal() signalAll()[8] InterruptedException[9] interrupted()[10] Executor[11] CopyOnWriteArrayList[1] start 与 runhttps://www.cnblo原创 2020-08-05 11:14:07 · 164 阅读 · 0 评论 -
【<线程锁死>】
【<线程锁死>】[1] 什么是线程锁死[2] 线程锁死分为哪两种[3] 活锁[3] 线程饥饿[5] 线程活性故障总结[1] 什么是线程锁死线程锁死是另一种常见的线程活性故障,与线程死锁不可以混为一谈。线程锁死的定义如下:线程锁死是指等待线程由于唤醒其所需的条件永远无法成立,或者其他线程无法唤醒这个线程而一直处于非运行状态(线程并未终止)导致其任务 一直无法进展。线程死锁和线程锁死的外部表现是一致的,即故障线程一直处于非运行状态使得其所执行的任务没有进展。但是锁死的产生条件和线程死锁不一样原创 2020-08-05 11:13:09 · 237 阅读 · 0 评论 -
【<死锁>】
死锁[1] 什么是死锁[2] 产生死锁的原因?[3] 死锁的产生必须满足的四个必要条件[4] 解决死锁的基本方法[5] 说下对悲观锁和乐观锁的理解?[6] 乐观锁常见的两种实现方式是什么?[1] 什么是死锁死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:[2] 产生死锁的原创 2020-08-05 11:12:32 · 269 阅读 · 0 评论 -
【CAS】
CAS[1] 什么是CAS?[2] 什么是自旋锁?[3] CAS可能出现的问题有什么?[4] 哪里有用到CAS?[5] CAS 和volatile如何实现无锁并发?[1] 什么是CAS?**CAS,英文全称compare-and-swap,即比较并交换,是一种乐观锁的思想。**CAS的思想很简单:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。工作内存首先会读取当前内存中将要修改的值,即预期原创 2020-08-05 11:10:16 · 192 阅读 · 0 评论 -
【<synchronized锁升级>】
synchronized锁升级[1] Java对象头[2] Mark word 结构[3] Monitor[4] synchronized锁升级无锁偏向锁(可关闭)轻量级锁重量级锁[5] synchronized锁流程[6] synchronized锁对比[1] Java对象头我们以 Hotspot 虚拟机为例,Hopspot 对象头主要包括两部分数据:Mark Word(标记字段) 和 Klass Pointer(类型指针)Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。原创 2020-08-05 11:09:03 · 364 阅读 · 0 评论 -
锁的属性
[1] 为什么要加锁之临界区多个线程访问共享资源时,在多个线程对共享资源读写操作时发生指令交错,就会出现问题。一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区。多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件。[2] 实现一个锁需要考虑哪些方面?实现一个锁,主要需要考虑2个问题如何线程安全的修改锁状态位?得不到锁的线程,如何排队?...原创 2020-08-05 11:07:04 · 136 阅读 · 0 评论 -
【JAVA中的锁】
【锁】[1] 公平锁/非公平锁[2] 可重入锁[3] 独享锁/共享锁(互斥锁/读写锁)[4] 乐观锁/悲观锁[5] 分段锁[6] 偏向锁/轻量级锁/重量级锁[7] 自旋锁[8] 可中断锁/不可中断锁/超时时间[9] 显式锁/隐式锁[10] 条件变量[11] AQSJAVA锁有哪些种类,以及区别(转)实现上SynchronizedReentrantLockCASVolatile2 类型上公平锁/非公平锁 :可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻原创 2020-08-05 11:06:45 · 115 阅读 · 0 评论 -
【同步的方式】
同步的方式[1] synchronized同步方法[2 synchronized同步代码块[3] 使用volatile实现线程同步[4] 使用 ReentrantLock实现线程同步[5] 使用ThreadLocal实现线程同步**[6] 使用LinkedBlockingQueue实现线程同步****[7] 使用原子变量实现线程同步**为何要使用同步?java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免原创 2020-08-05 11:04:14 · 169 阅读 · 0 评论 -
as-if-serial与happens-before
as-if-serial规则:as-if-serial语义的意思指:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器,runtime 和处理器都必须遵守as-if-serial语义。happens-before:JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happens-before关系,尽管a操作和b操作在不同的线程中执行,但JMM向程序员保证a操作将对b操作可见)。具体的定原创 2020-08-05 11:02:56 · 470 阅读 · 0 评论 -
synchronized 和Lock区别
https://blog.csdn.net/qq_29373285/article/details/859644601. 在实现上synchronized是一个关键字,它基于JVM。它有锁升级过程,从偏向锁,轻量级锁,到重量级锁。Lock是一个接口,它是基于JDK,它实现的主要实现类是ReentrantLock,它的使用也离不开AQS。2. 在使用上synchronized是隐式锁,加锁解锁对使用者是隐藏的,可以作用于方法,代码块和类。Lock是显示锁,需要手动上锁和释放锁(lock和unl.原创 2020-08-05 11:02:16 · 206 阅读 · 0 评论 -
ThreadLocal有了解吗?
**答:**使用ThreadLocal维护变量时,其为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程对应的副本。ThreadLocal内部实现机制:每个线程内部都会维护一个类似HashMap的对象,称为ThreadLocalMap,里边会包含若干了Entry(K-V键值对),相应的线程被称为这些Entry的属主线程Entry的Key是一个ThreadLocal实例,Value是一个线程特有对象。Entry的作用是为其属主线程建立起一个Thread原创 2020-08-05 11:01:44 · 187 阅读 · 0 评论 -
final原理
原创 2020-08-05 11:00:55 · 198 阅读 · 0 评论 -
说一下从Java API层面上的6种线程状态
新建(New):这是属于一个已经创建的线程,但是还没有调用start方法启动的线程所处的状态。可运行(Runnable):该状态包含两种可能。有可能正在运行,或者正在等待CPU资源。包含了操作系统线程状态种的运行,可运行状态和阻塞状态(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为是可运行);阻塞(Blocked):阻塞状态,当线程准备进入synchronized同步块或同步方法(排它锁)的时候,需要申请一个监视器锁而进行的等待,会使线程进入BLOCKED状态。如果其线程释放了锁就会.原创 2020-08-05 10:59:59 · 276 阅读 · 0 评论 -
多线程环境下的线程安全体现在哪些方面?
答:多线程环境下的线程安全主要体现在原子性,可见性与有序性方面。原子性是一组操作要么完全发生,要么没有发生,其余线程不会看到中间过程的存在。对于涉及到共享变量访问的操作,若该操作从执行线程以外的任意线程来看是不可分割的,那么该操作就是原子操作,该操作具有原子性。即,其它线程不会“看到”该操作执行了部分的中间结果。**举例:**银行转账流程中,A账户减少了100元,那么B账户就会多100元,这两个动作是一个原子操作。我们不会看到A减少了100元,但是B余额保持不变的中间结果。Java原子性的实现原创 2020-08-05 10:54:57 · 636 阅读 · 0 评论 -
什么是重排序?
为了提高性能,编译器和处理器常常会对既定的代码执行顺序进行指令重排序。重排序的类型有哪些呢?源码到最终执行会经过哪些重排序呢?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6dBjpmI-1596596115046)(X:\Users\xu\AppData\Roaming\Typora\typora-user-images\image-20200518153028933.png)]一个好的内存模型实际上会放松对处理器和编译器规则的束缚,也就是说软件技术和硬件技术都为同原创 2020-08-05 10:55:30 · 1129 阅读 · 0 评论 -
创建线程的方式及其区别?
方法一,继承 Thread类// 创建线程对象Thread t = new Thread() { public void run() { // 要执行的任务 }};// 启动线程t.start();例如:package cn.mycast;import lombok.extern.slf4j.Slf4j;@Slf4j(topic= "c.创建一个线程")public class 创建一个线程 { public static void main(String[] arg原创 2020-08-05 10:56:52 · 191 阅读 · 0 评论