随笔分类 -  Java多线程

多线程的相关知识
摘要:原因 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,如果无外力的干涉那它们都将无法推进下去,如果系统的资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁 代码 public class DeadLockDemo { p 阅读全文
posted @ 2020-06-19 15:35 叮叮叮叮叮叮当 阅读(247) 评论(0) 推荐(0) 编辑
摘要:原始结构 synchronized 是关键字属于 JVM 层面,反应在字节码上是 monitorenter 和 monitorexit,其底层是通过 monitor 对象来完成,wait/notify 等方法也是依赖 monitor 对象,只有在同步块或方法中才能调用 wait/notify 等方法 阅读全文
posted @ 2020-06-19 14:39 叮叮叮叮叮叮当 阅读(184) 评论(0) 推荐(0) 编辑
摘要:概念 首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如图所示: 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞 当阻塞队列是满时,往队列里添加元素的操作将会被阻塞 核心方法 抛异常:如果操作不能马上进行,则抛出异常 特定的值:如果操作不能马上进行,将会返回一个特殊的值,一般是 tru 阅读全文
posted @ 2020-06-18 10:29 叮叮叮叮叮叮当 阅读(233) 评论(0) 推荐(0) 编辑
摘要:适用性 缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存 Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地, 阅读全文
posted @ 2020-06-17 17:41 叮叮叮叮叮叮当 阅读(1630) 评论(0) 推荐(0) 编辑
摘要:公平和非公平锁 公平锁:是指多个线程按照申请的顺序来获取值。在并发环境中,每一个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个就占有锁,否者就会加入到等待队列中,以后会按照 FIFO 的规则获取锁 非公平锁:是指多个线程获取值的顺序并不是按照申请锁的顺序,有可能后 阅读全文
posted @ 2020-06-17 15:13 叮叮叮叮叮叮当 阅读(705) 评论(0) 推荐(0) 编辑
摘要:写入时复制(CopyOnWrite) 写入时复制(CopyOnWrite,简称COW)思想是计算机程序设计领域中的一种优化策略。其核心思想是,如果有多个调用者(Callers)同时要求相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者视图修改资源内容时 阅读全文
posted @ 2020-06-17 14:22 叮叮叮叮叮叮当 阅读(311) 评论(0) 推荐(0) 编辑
摘要:ArrayList的线程安全故障 /** * 发现报java.util.ConcurrentModificationException */ public class ContainerDemo { public static void main(String[] args) { List<Inte 阅读全文
posted @ 2020-06-17 11:08 叮叮叮叮叮叮当 阅读(109) 评论(0) 推荐(0) 编辑
摘要:原子引用 public class AtomicReferenceDemo { public static void main(String[] args) { User cuzz = new User("cuzz", 18); User faker = new User("faker", 20); 阅读全文
posted @ 2020-06-17 10:58 叮叮叮叮叮叮当 阅读(170) 评论(0) 推荐(0) 编辑
摘要:原子类使用 public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(666); // 获取真实值,并替换为相应的值 boolean 阅读全文
posted @ 2020-06-17 10:49 叮叮叮叮叮叮当 阅读(255) 评论(0) 推荐(0) 编辑
摘要:概念 volatile 是 Java 虚拟机提供的轻量级的同步机制,保证可见性,禁止指令重排,不保证原子性 保证可见性 public class VolatileDemo { public static void main(String[] args) { Data data = new Data( 阅读全文
posted @ 2020-06-16 17:00 叮叮叮叮叮叮当 阅读(120) 评论(0) 推荐(0) 编辑
摘要:基本概念 JMM 本身是一种抽象的概念并不是真实存在,它描述的是一组规范,通过这组规范定义了程序的访问方式 JMM 同步规定 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最新值到自己的工作内存 加锁解锁是同一把锁 由于 JVM 运行程序的实体是线程,而每个线程创建时 JV 阅读全文
posted @ 2020-06-16 16:34 叮叮叮叮叮叮当 阅读(202) 评论(0) 推荐(0) 编辑
摘要:使用线程池的目的 线程是稀缺资源,不能频繁的创建 解耦作用:线程的创建与执行完全分开,方便维护 将其放入一个池子中,可以给其他任务进行复用 优点 降低资源消耗,通过重复利用已创建的线程来降低线程创建和销毁造成的消耗。 提高相应速度,当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的 阅读全文
posted @ 2019-07-07 11:03 叮叮叮叮叮叮当 阅读(270) 评论(0) 推荐(1) 编辑
摘要:上一篇文章介绍了AQS的基本原理,它其实就是一个并发包的基础组件,用来实现各种锁,各种同步组件的。它包含了state变量、加锁线程、等待队列等并发中的核心组件,现在我们来看一下多线程获取锁的顺序问题。 1 /** 2 * Creates an instance of {@code Reentrant 阅读全文
posted @ 2019-07-07 10:34 叮叮叮叮叮叮当 阅读(399) 评论(0) 推荐(1) 编辑
摘要:ReentrantLock和AQS的关系 首先我们来看看,如果用java并发包下的ReentrantLock来加锁和释放锁,是个什么样的: 1 ReentrantLock reentrantLock = new ReentrantLock(); 2 reentrantLock.lock(); 3 / 阅读全文
posted @ 2019-06-23 12:04 叮叮叮叮叮叮当 阅读(198) 评论(0) 推荐(1) 编辑
摘要:计算机的内存模型: 计算机在运行行程序的时候,指令由CPU执行,计算机上数据存放在物理内存当中,CPU在执行指令的时候免不了要和数据打交道。刚开始,还相安无事的,但是随着CPU技术的发展,CPU的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和CPU的执行速度比 阅读全文
posted @ 2019-06-23 10:40 叮叮叮叮叮叮当 阅读(771) 评论(0) 推荐(1) 编辑
摘要:在Java多线程并发的情况下同时对一个变量进行操作会出现线程安全的问题,假如我们现在使用20个线程对一个变量不停累加1,代码如下: 1 public class ThreadDemo implements Runnable { 2 private int num = 0; 3 @Override 4 阅读全文
posted @ 2019-06-16 17:37 叮叮叮叮叮叮当 阅读(867) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示