多线程学习
文章平均质量分 83
lsd&xql
不积跬步,无以至千里。
展开
-
JUC原理之锁机制原理二
JUC原理之锁机制原理二ReentrantReadWriteLock(读写锁)核心变量和构造器核心内部类tryAcquire获取写锁的流程tryAquire获取读锁的流程ReentrantReadWriteLock(读写锁)适用于读多写少的场景。(读不上锁,写上锁)将原来的锁,分割为两把锁:读锁、写锁。适用于读多写少的场景,读锁可以并发,写锁与其他锁互斥。写写互斥、写读互斥、读读兼容。Demo如下:public class ThreadDemo { static volatile int原创 2022-04-07 00:03:39 · 180 阅读 · 0 评论 -
JUC原理之锁机制原理一
计算机底层简单介绍JUC出现的原因?为java语言提供多线程同步结构的支撑JUC解决了什么问题?用于解决多线程同步问题,给Java开发者提供便利的函数和功能、结构JUC包含了哪些内容?原子类、锁类、工具类(线程同步结构、线程池等等)如何实现一把锁?1、表示当前锁状态2、保证多线程抢锁线程安全3、处理没有获取到锁的线程4、释放锁后如何处理未获得锁的线程...原创 2022-03-28 22:15:02 · 355 阅读 · 0 评论 -
多线程与高并发学习八
多线程与高并发学习八手敲一个定义拒绝策略的例子ThreadPoolExecutor源码解析常用变量的解释构造方法提交执行task的过程addworker源码解析线程池worker任务单元核心线程执行逻辑-runworker手敲一个定义拒绝策略的例子 public static void main(String[] args) { ExecutorService service = new ThreadPoolExecutor(4, 4, 0, Tim原创 2022-03-10 00:00:26 · 104 阅读 · 0 评论 -
高并发与多线程学习七(二)
多线程与高并发学习七(二)线程池参数ThreadPoolExecutorSingleThreadPoolCachedThreadPoolFixedThreadPool线程池参数线程池分为以下两种:1、ThreadPoolExecutor2、ForkJoinPool(分叉完了再汇总)分解汇总的任务用很少的线程可以执行很多的任务(子任务)ThreadPoolExecutor做不到先执行子任务CPU密集型ThreadPoolExecutor线程池七个参数:1、corePoolSize:核心线程原创 2022-03-09 00:25:26 · 252 阅读 · 0 评论 -
多线程与高并发学习七
多线程与高并发学习七面试题1、要求用线程顺序打印A1B2C3....Z26面试题1、要求用线程顺序打印A1B2C3…Z26解法一(LockSupport):代码如下: static Thread t1 = null, t2 = null; public static void main(String[] args) { t1 = new Thread(() -> { for (char a ='A'; a <= 'Z'; a++)原创 2022-03-08 00:05:54 · 184 阅读 · 0 评论 -
多线程与高并发学习六
多线程与高并发学习六ThreadLocal强引用软引用弱引用虚引用并发容器ThreadLocal简介:多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题,而ThreadLoca原创 2022-01-23 22:28:07 · 287 阅读 · 0 评论 -
多线程与高并发学习五
多线程与高并发学习五ReentrantLock源码如下源码阅读为JDK11版本ReentrantLock源码ReentrantLock的lock方法调用链路如下所示:调用源码如下所示:第一步:第二步:它会去找Sync的子类NonfairSync第三步:进入NonfairSync此处发现这个类没有aquire方法,然后就去它的父类找,然后父类的Sync也没有那个aquire方法,再去Sync的父类AbstractQueuedSychronizer找。第四步找到该aquire方法原创 2022-01-13 00:37:14 · 235 阅读 · 0 评论 -
多线程与高并发学习四
多线程与高并发学习四CyclicBarrier(循环栅栏)PhaserReadWriteLockSemaphore(信号量)Exchanger面试题CyclicBarrier(循环栅栏)满人了之后再发车(满人了之后将栅栏去掉发车)CyclicBarrier barrier = new CyclicBarrier(20, () -> System.out.println(“满人”));其中第一个参数代表执行前置的数量,第二个参数代表满人了执行什么操作。使用场景:如一个特别复杂的操作:需要访原创 2022-01-09 23:24:18 · 469 阅读 · 0 评论 -
多线程与高并发学习三
多线程与高并发学习三LongAdder()LongAdder()先看如下demo:这里采用三种方式去实现count的递增,分别是Atomic,sychronized和LongAdder(),此处的结果发现LongAdder的执行速度是最快的,但是当循环次数变少,或者是线程数量变少LongAdder则不一定是最快的了,实际上采用哪种方式应该考虑以后程序并发率到底有多高,如果没有特别高的情况下,会发现未必Atomic或者LongAdder就是最好的。public class AtomicVsSyncVs原创 2022-01-04 22:38:23 · 258 阅读 · 0 评论 -
多线程与高并发学习二
多线程与高并发学习二Volatile不能保证原子性锁的细化DEMO应该避免锁定对象的引用变成另外的对象CAS的ABA问题理解Volatile不能保证原子性public class VolatileNotSync { volatile int count = 0; void m() { for (int i = 0; i < 10000; i++) count++; } public static void main(String[] args)原创 2021-12-30 00:06:02 · 297 阅读 · 0 评论 -
多线程与高并发学习一
多线程与高并发学习一线程的三个方法sleep,yield,join线程的三个方法sleep,yield,joinsleep让线程进入timed_waiting状态,yield让线程进入Runable中的Ready状态等待获取CPU资源,join是当前线程调用另一线程的join方法,此时CPU调用另一线程等待另一个线程执行完毕后再执行当前的线程。public class Sleep_Yield_Join { public static void main(String[] args) {//原创 2021-12-24 23:20:24 · 421 阅读 · 0 评论 -
多线程学习之sychronized锁升级剖析
多线程学习之sychronized锁升级深入剖析首先首区分内核态以及用户态认识对象的内存布局首先首区分内核态以及用户态将操作系统分级别用户态:只能访问用户能够访问的指令内核态:执行在内核空间的,能访问所有指令JDK早期,synchronized叫做重量级锁,因为申请锁资源必须通过kernel,系统调用,由JVM用户态到OS内核态,都需要经过用户态到内核态的转换。认识对象的内存布局对象的内存布局:当我们new一个对象的时候它里面的内存是如何分布的?hotspot实现:class T{ in原创 2021-12-06 23:02:36 · 811 阅读 · 0 评论 -
多线程学习之并发编程的原子性
并发编程的原子性首先看一个小程序如何保证并发编程的原子性?(上锁)同步的一些概念乐观锁与悲观锁首先看一个小程序public class T00_00_IPlusPlus { private static long n = 0L; public static void main(String[] args) throws Exception { //Lock lock = new ReentrantLock(); Thread[] threads =原创 2021-11-10 22:55:17 · 389 阅读 · 0 评论 -
并发编程之线程的有序性
并发编程的有序性程序真的是按“顺序”执行的吗?为什么会存在乱序的现象(为了提高效率)乱序发生的原则(语句执行交换顺序的条件)通过小程序认识可见性和有序性问题程序真的是按“顺序”执行的吗?乱序的验证:public class T01_Disorder { private static int x = 0, y = 0; private static int a = 0, b = 0; public static void main(String[] args) throws I原创 2021-11-07 23:54:51 · 512 阅读 · 1 评论 -
多线程学习五并发编程的可见性
并发编程的可见性 可见性是否一定要加volatile才能让线程可见?volatile修饰的引用类型(包括数组)只能保证引用本身的可见性,不能保证内部字段的可见性理解线程中的缓存缓存行基本概念理解可见性看如下代码:public class HelloVolatile { private static volatile boolean running = true; //private static /*volatile*/ boolean running = true; priv原创 2021-10-28 00:29:28 · 190 阅读 · 0 评论 -
线程知识学习四(线程的“结束”)
如何优雅的结束线程 线程结束1、 使用stop方法2、Suspend and Resume3、Volatile Flag4、interrupt(设置标志位【更优雅】)线程结束结束线程的方法:1、自然结束2、stop(),suspend(),resume()3、volatile标志1、不适合某些场景(比如还没有同步的时候,线程做了阻塞操作,没有办法循环回去)2、打断时间也不是特别精确,比如一个阻塞容器,容量位5的时候结束生产者,但是,由于volatile同步线程标志位的时间控制不是很精确,有可能原创 2021-10-24 02:21:04 · 228 阅读 · 0 评论 -
线程知识学习三(线程的“打断”)
线程知识学习三(线程的“打断”)interrupt的三个方法interrupt的三个方法1、interrupt():打断某个线程(设置线程中断标志位)2、isInterrupted():查询某个线程是否被打断过(查询中断标志位)3、static interrupted():查询当前线程是否被打断过,并重置打断标志public class Interrupt_and_isInterrupted { public static void main(String[] args) {原创 2021-10-18 23:48:03 · 621 阅读 · 0 评论 -
线程知识学习二(创建线程的五种方式及线程的状态)
线程知识学习二(创建线程的五种方式及线程的状态)创建线程的五种方式线程的六种状态创建线程的五种方式1、继承Thread类(不建议使用,Java单继承,使用此方式不灵活)2、实现Runnable接口3、lambda表达式4、使用ThreadPool(池子里面已经有线程,然后直接通过池子往外拿)5、实现Callable接口(Runnable无返回值Callable有返回值)public class HowToCreateThread { static class MyThread exte原创 2021-10-16 23:01:50 · 221 阅读 · 0 评论 -
多线程基础知识学习总结
多线程基础知识学习总结线程的历史 —— 一部对CPU压榨的血泪史线程进程概念单核CPU设定多线程是否有意义?工作线程数是否设置的越大越好?线程的历史 —— 一部对CPU压榨的血泪史1、单线程人工切换(纸带机)CPU利用效率低很多时间是等着人去换各种纸带2、多进程批处理(多个任务批量执行)但是如果其中一个任务等待的话也会导致其他任务跟着等待3、多进程并行处理(把程序写在不同的内存位置上来回切换)4、多线程(一个程序内部不同任务的来回切换)5、纤程/协程(绿色线程,用户管理的【而不是OS管理的】原创 2021-10-12 00:01:55 · 304 阅读 · 0 评论