![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 75
thetimelyrain
见微知著
展开
-
ThreadLocal内存泄露代码演示,和内存泄露原因分析
引发的内存泄漏分析预备知识引用Object o = new Object();这个o,我们可以称之为对象引用,而new Object()我们可以称之为在内存中产生了一个对象实例。当写下 o=null时,只是表示o不再指向堆中object的对象实例,不代表这个对象实例不存在了。强引用一直活着:类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象实例。软引用有一次活的机会:软引用关联着的对象,在系统将要发生内转载 2021-10-02 17:30:54 · 670 阅读 · 0 评论 -
记一次由于cas和线程调度出现的问题
先直接上代码:import sun.misc.Unsafe;import java.lang.reflect.Field;public class UnSafeTest { private int i = 0; private static Unsafe UNSAFE; private static Long I_OFFSET; static { try { Field field = Unsafe.class.ge原创 2021-05-27 22:38:29 · 111 阅读 · 1 评论 -
LockSupport的park()和unpark()的简单使用
concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类:Unsafe(提供CAS操作) LockSupport(提供park/unpark操作)因此,LockSupport非常重要。两个重点(1)操作对象归根结底,LockSupport.park()和LockSupport.unpark(Thread thread)调用的是Unsafe中的native代码://LockSupport中public static原创 2021-03-09 16:55:09 · 1434 阅读 · 0 评论 -
Thread 的join方法源码解读
一、作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。具体看代码:public class JoinTest { public static void main(String [] args) throws InterruptedException { ThreadJoinTest t1 = new ThreadJoinTest("小明"); ThreadJoinTest t2 = new ThreadJoi原创 2021-02-21 11:49:58 · 248 阅读 · 0 评论 -
java中ReentrantLock类的tryLock的标准例子和用法
package Lock;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class LockDemo { .原创 2020-08-21 16:34:00 · 1786 阅读 · 0 评论 -
偏向锁,轻量级锁及重量级锁的加锁和升级过程分析
说明:本文不探讨这些锁的原理,仅仅简单说明锁升级的流程锁的简单说明:偏向锁:偏向锁是JDK6中引入的一项锁优化,它的目的是消除数据在无竞争情况下的同步原语,进一步提高程序的运行性能。偏向锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他的线程获取,则持有偏向锁的线程将永远不需要同步。大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。轻量级锁轻量级锁提升程序同步性能的依据是:对于绝大部分的锁,在整个同步周期内原创 2020-07-15 13:45:11 · 1187 阅读 · 0 评论 -
ReentrantLock的原理和AQS的应用
转载中华石杉大神的文章[link]https://mp.weixin.qq.com/s/PAn5oTlvVmjMepmCRdBnkQ转载 2020-07-14 16:39:11 · 89 阅读 · 0 评论 -
java安全的发布一个对象
发布与逸出对象发布:"发布"一个对象的意思是指,使对象能够在当前作用域之外的代码中使用.例如:将一个指向该对象的引用保存到其他代码可以访问的地方,或者在某一个非私有的方法中返回该引用,或者将引用传递到其他类的方法中.发布一个对象最简单的方法是将对象的引用保存到一个公有的静态变量中,以便任何类和变量都能看见该对象.public class PublishDemo { public static Set<String> stringSet; public原创 2020-07-13 15:10:03 · 266 阅读 · 0 评论 -
wait()方法为什么要放在while循环里面(虚假唤醒 过早唤醒)
java在使用内置锁实现消费者-生产者模式的时候,可以使用wait,notify,notifyAll三个方法,而且这三个方法都是基类Object的方法,要调用某一个对象的同步方法时,必须将其放在sycronized修饰的方法、对象、代码块里面,你必须先持有对象上的锁,才能在某个条件下,修改其等待状态,下面给出了使用同步方法的标准代码模式:synchronized (obj) { while (<condition does not hold>竞态条件)原创 2020-07-08 17:21:59 · 3340 阅读 · 2 评论 -
显示锁ReentrantLock和Lock的使用
Jdk1.5以后,Doug Lea大神添加了新的多线程的包,在java.util.concurrent.locks下,有一组实现线程同步的接口Lock和类ReentrantLock.ReentrantLock也是Lock接口的唯一实现类.Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有的加锁和解锁方法都是显示的.public interface Lock { // 用来获取锁,如果锁已经被其他线程获取,则一直等待,直到获取到锁 void lock(); /原创 2020-07-07 15:21:10 · 453 阅读 · 0 评论 -
ReentrantLock的三种获取锁Lock,tryLock,lockInterruptibly的区别
重入锁有三种获取锁的方式,本文就是来说明三种方式的异同点的.原创 2020-07-08 11:21:16 · 4563 阅读 · 0 评论 -
JAVA语言模拟CAS的ABA问题
什么是CAS机制CAS是英文单词Compare And Swap的缩写,翻译过来就是比较和替换。CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。如何保证多核心下的线程安全?系统底层进行CAS操作的时候,会判断当前系统是否是多核心系统,如果是就给"总线"加锁,只有一个线程能对总线加锁成功,加锁成功之后会进行CAS操作,CAS的原子性是平台级别的..原创 2020-07-03 17:58:08 · 188 阅读 · 0 评论 -
Executors的unconfigurableExecutorService()方法
Executors有一个静态方法,该方法可以对现有的ExecutorService进行包装,使其只暴露出ExecutorService的方法,因此不能对其进行配置,如果我们需要创建不可更改的线程池,可以使用这个方法: Executors.unconfigurableExecutorService(executorService);//不可配置的线程池 Executors.unconfigurableScheduledExecutorService(scheduledExecut..原创 2020-07-03 10:41:41 · 483 阅读 · 0 评论 -
自定义代码实现简单的CAS逻辑
场景:创建20个线程,每一个线程循环给成员变量加一,循环次数为100次,理论结果线程结束后结果为2000.下面先给出基本代码:输出结果并不是2000,而是比2000小,这是因为count++这个操作,并非原子操作,具体原因可以百度volitile关键字.下面给出使用CAS原理改造的代码:package com.springcloud.server.springserver.thread;public class CasDemo { private static vo..原创 2020-07-02 17:45:18 · 716 阅读 · 4 评论 -
ThreadPoolExecutor 中的 shutdown() 、shutdownNow() 、awaitTermination() 的用法和区别
在使用线程池的时候,ExecutorService提供了两种关闭线程池的方法,shutdown()和shutdownNow(),先不墨迹,直接写出这两个方法的作用:使用shutdown正常关闭将线程池状态置为SHUTDOWN,线程池并不会立即停止:停止接收外部submit的任务 内部正在跑的任务和队列里等待的任务,会执行完 等到第二步完成后,才真正停止使用shutdownNow强行关闭将线程池状态置为STOP。企图立即停止,事实上不一定:跟shutdown()一样,先停止接收外部提交的原创 2020-06-23 11:34:44 · 12856 阅读 · 0 评论 -
多线程之interrupt(),isInterrupted()和interrupted()的区别以及线程中断机制
并发编程原创 2020-07-14 15:13:48 · 586 阅读 · 0 评论