![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java线程
文章平均质量分 98
三颗青菜
这个作者很懒,什么都没留下…
展开
-
ReentrantReadWriteLock读写锁
ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量转载 2020-10-28 17:46:52 · 79 阅读 · 0 评论 -
java中Unsafe使用讲解
前段时间因为看JUC的源码,里面有大量关于unsafe的操作,所以就来看看了.写点笔记总结下:unsafe可以帮我们直接去操作硬件资源,当然了是借助java的jit来进行的,官方不推荐使用,因为不安全,例如你使用unsafe创建一个超级大的数组,但是这个数组jvm是不管理的,只能你自己操作,容易oom,也不利于资源的回收.好了,下面我们来看代码,1.获取unsafe//1.最简单的使用方式是基于反射获取Unsafe实例Field f = Unsafe.class.getDeclaredField(转载 2020-05-15 12:04:26 · 613 阅读 · 1 评论 -
JAVA中Random分析
JAVA中提供了几个常用的用于生成随机数(流,JDK 8支持)的API:Random,ThreadLocalRandom,SecureRandom,SplittableRandom;这几个类在使用场景上,稍微有些区分。Random生成伪随机数(流),使用48位种子,使用线性同余公式进行修改。可以通过构造器传入初始seed,或者通过setSeed重置(同步);默认seed生成主导变量为系统时间的纳秒数。 public Random() { this(seedUniquifier转载 2020-05-14 20:20:23 · 247 阅读 · 0 评论 -
使用ThreadLocal不当可能会导致内存泄露
使用ThreadLocal不当可能会导致内存泄露基础篇已经讲解了ThreadLocal的原理,本节着重来讲解下使用ThreadLocal会导致内存泄露的原因,并讲解使用ThreadLocal导致内存泄露的案例。为何会出现内存泄露基础篇我们讲到了ThreadLocal只是一个工具类,具体存放变量的是在线程的threadLocals变量里面,threadLocals是一个ThreadLocalMap类型的static class ThreadLocalMap { /**转载 2020-05-12 11:33:30 · 175 阅读 · 0 评论 -
Java内存模型基础知识
并发编程模型的两个关键问题线程间如何通信? 即:线程之间以何种机制交换信息线程间如何同步?即:线程以何种机制来控制不同线程间操作发生的相对顺序有两种并发模型可以解决这两个问题:消息传递并发模型共享内存并发模型两种模式的区别:如何通信如何同步消息传递并发模型线程之间没有公共状态,线程之间的通信必须发送消息来实现进行通信发送消息天然同步,因为发送的消息总...原创 2020-05-08 11:42:20 · 153 阅读 · 0 评论 -
进程和线程的概念
进程应用程序在内存中开辟空间,通过CPU时间片轮转的机制显示宏观意义上的并发,但对于单个CPU来说,任何时刻都只有一个任务在占用资源。CPU时间片轮转:CPU为每个进程分配一个时间段,称为时间片。如果在该时间片结束时,进程还在运行,则暂停进程的运行,保存进程状态。之后将CPU资源分配给另一个进程。如果进程在时间片结束前结束,则CPU立即切换到其他进程,不等时间片用完。线程线程作为进程的...原创 2020-05-07 16:04:30 · 113 阅读 · 0 评论 -
CAS(Compare And Swap) 详解
CAS实例 class AccountSafe implements Account { private AtomicInteger balance; public AccountSafe(Integer balance) { this.balance = new AtomicInteger(balance); } public Integer getBalance...原创 2020-04-29 17:10:39 · 395 阅读 · 0 评论 -
happens-before详解
happens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结,抛开以下 happens-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其它线程对该共享变量的读可见。线程解锁 m 之前对变量的写,对于接下来对 m 加锁的其它线程对该变量的读可见t1线程对x赋值10,对于t2线程是可见的。 static int x; s...原创 2020-04-29 11:15:15 · 177 阅读 · 0 评论 -
单例模式之双检查
public final class Singleton { private Singleton() { } private static Singleton INSTANCE = null; public static Singleton getInstance() { if(INSTANCE == null) { // t2 // 首次访问会同步,而之后的使用没有 ...原创 2020-04-29 11:04:03 · 177 阅读 · 0 评论 -
Java内存模型(JMM)详解
JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面:原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响原子性多线程情况下,保证cpu指令执行的整体性。可见性问题:...原创 2020-04-28 19:08:32 · 305 阅读 · 0 评论 -
线程的活跃性
死锁有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁t1 线程 获得 A对象 锁,接下来想获取 B对象 的锁 t2 线程 获得 B对象 锁,接下来想获取 A对象 的锁死锁是由于无法获取到锁而无法继续执行 public static void main(String[] args) { Object A = new Object(); Obj...原创 2020-04-24 19:42:55 · 212 阅读 · 0 评论 -
LockSupport类中的park()和unpark()
使用LockSupport.park()用来阻塞线程;LockSupport.unpark(t1)用来唤醒特定线程; public static void main(String[] args) { Thread t1 = new Thread(() -> { log.debug("start..."); sleep(...原创 2020-04-24 16:20:19 · 1147 阅读 · 0 评论 -
线程中的设计模式
同步模式之保护性暂停同步模式解决的是一个线程需要等待另一个线程的执行结果。创建一个类用来保存结果,作为沟通两个线程的桥梁 private Object response; private final Object lock = new Object(); // 得到返回的结果 public Object get() { synchronized (l...原创 2020-04-24 15:39:37 · 113 阅读 · 0 评论 -
线程间的通信之wait和notify的使用
wait和notify底层原理Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片BLOCKED 线程会在 Owner 线程释放锁时唤醒WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获...原创 2020-04-23 16:04:55 · 217 阅读 · 0 评论 -
线程安全问题和Synchronized的使用
线程安全问题多个线程对共享资源读写时出现指令交错,就会出现线程安全问题。当多个线程访问某一个类(方法)时,这个类始终都能表现出正确的行为,那么这个类(方法)就是线程安全的。临界区一段代码块内,如果存在对共享资源的多线程读写操作,称这段代码块为临界区。static int i=0;//临界区void add() { i++;}线程安全问题解决方法阻塞式引入锁的概念,线程进...原创 2020-04-23 14:46:57 · 159 阅读 · 0 评论 -
Java线程的6个状态及状态的间的转换
假设有线程 Thread t情况 1 NEW --> RUNNABLE当调用 t.start() 方法时,由 NEW --> RUNNABLE情况 2 RUNNABLE <–> WAITINGt 线程用 synchronized(obj) 获取了对象锁后调用 obj.wait() 方法时,t 线程从 RUNNABLE --> WAITING调用 o...原创 2020-04-24 18:16:29 · 212 阅读 · 0 评论