从头开始学多线程
文章平均质量分 88
小大宇
能与优秀的人为伍自然就会变优秀
展开
-
ThreadLocal内存泄露
内存泄漏memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 内存溢出 out of memory:没内存可以分配给新的对象了。 我们知道,线程Thread对象中,每个线程对象内部都有一个的ThreadLocalMap对象。如果这个对象存储了多个大...原创 2020-06-19 17:57:33 · 15086 阅读 · 10 评论 -
无锁机制----比较交换CAS Compare And Swap
一、锁与共享变量 加锁是一种悲观的策略,它总是认为每次访问共享资源的时候,总会发生冲突,所以宁愿牺牲性能(时间)来保证数据安全。 无锁是一种乐观的策略,它假设线程访问共享资源不会发生冲突,所以不需要加锁,因此线程将不断执行,不需要停止。一旦碰到冲突,就重试当前操作直到没有冲突为止。 无锁的策略使用一种叫做比较交换的技术(CAS Compare And.........原创 2020-06-19 17:56:11 · 23586 阅读 · 10 评论 -
JUC实现生产者消费者队列
在内存中,J.U.C提供的ThreadPoolExecutor可支持排队,通过BlockingQueue暂存还没有来得及执行的任务。 corePoolSize:没有任务执行的时候的线程数量。相当于常驻工作组。 maxPoolSize:如果队列已经满了,并且当前线程数量少于corePoolSize,那么就会创建新的线程。但是总线程数量不会超过maxPoolSize。...原创 2021-09-17 14:10:20 · 262 阅读 · 0 评论 -
Java多线程编程核心技术-----第一章读书笔记
1.1 进程:正在执行的程序。进程是OS分配资源的最小单位。 线程:正在执行的程序的子任务。线程是程序执行的最小单位。 原:使用多线程的优点:可在同一时间运行更多不同的任务。 P3 原:使用多线程也就是在使用异步。P3(异步:你弄你的,我弄我的,互不干扰) 同步是什么?同步的概念就是共享,共享同一个资源就会出现线程...原创 2018-07-20 11:18:55 · 508 阅读 · 0 评论 -
Java多线程编程核心技术-----第二章读书笔记
2.1.1 方法里面的变量是临时变量,在栈内创建。 多次调用某个方法,则多次创建临时变量,线程安全。2.1.2 多个线程通过某方法同时操作同一个对象的属性,可能是线程不安全的,需要把操作的方法加上同步锁2.1.3 同步方法的同步锁是对象锁,锁是当前的对象,效果相当于 synchronized(this){}这样的同步代码块...原创 2018-07-23 17:37:34 · 392 阅读 · 0 评论 -
Java多线程编程核心技术-----第三章读书笔记
3.1.3 调用wait()或notify()等方法的对象,必须是同步锁对象,否则抛出IllegalMonitorStateException. 比如同步方法中只能是 this.lock()。 wait()使当前执行代码的线程进入等待状态(冷冻暂停),并释放同步锁。 sleep方法不释放同步锁。 调用wait()方法...原创 2018-07-25 09:02:16 · 352 阅读 · 0 评论 -
Java多线程编程核心技术-----第四章读书笔记
4.1.1 原:调用ReentrantLock对象的lock()方法获取锁,调用unlock()方法释放锁。P201 Lock lock = new ReentrantLock(); 如果不调用lock.unlock()释放锁,那么即使线程任务结束,仍然不会释放锁。抛出异常也不会释放锁。4.1.2 原:调用lock.lock()代...原创 2018-07-26 17:03:45 · 292 阅读 · 0 评论 -
Java多线程编程核心技术-----第五章读书笔记
5.1 原:Timer类的主要作用就是设置任务,TimerTask类用于封装任务。P241 Timer开启一个线程,可以通过构造器接收true将其作为守护线程。new Timer(true); 如果Timer timer = new Timer(); 则执行完任务仍然不关闭线程, 因为一个timer能开启多个任务task,在等待其它任...原创 2018-07-27 10:35:58 · 266 阅读 · 0 评论 -
Java并发编程的艺术-----第二章读书笔记
1.1 原文:时间片是CPU分配给各个线程的时间。P1 时间片是CPU分配给各个线程的时间,一般是几十毫秒。 原文:上下文切换P1 任务从保存到再加载的过程是一次上下文切换。一个任务可能没有执行完毕就释放了锁,再次争抢同步锁并读取线程内的私有工作内存需要一定的时间,或者说是性能消耗。1.1.2 并发执行的...原创 2018-09-18 10:07:36 · 301 阅读 · 0 评论 -
Java并发编程的艺术-----第三章读书笔记
3.1 原文:Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另外一个线程可见。P22 Java内存模型JMM定义了写到本地内存中的数据何时刷新到主存中。 原文:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存存储了该线程的共享变量的副本。P22 线程之...原创 2018-09-19 09:26:06 · 431 阅读 · 0 评论 -
Java并发编程的艺术-----第四章读书笔记
4.1.2 为什么要使用多线程? 一个线程在同一时刻只能运行在一个处理器核心上。如果程序使用多线程,那么程序就会被分配到多个处理器核心上,这样就会显著减少程序的处理时间,并且随着更多处理器核心的加入,程序的执行会变得更有效率。P84 使用多线程的程序:耗时少,效率高。 4.1.3 线程会得到OS分配的若干时间片,当线...原创 2018-09-21 11:12:52 · 315 阅读 · 0 评论 -
Java并发编程的艺术-----第五章读书笔记
前言:哇,这一章是真的费劲,以前是知其然,这次探索了如此多的同步组件的源码,终于是知其所以然了。 下一步也能开发自己的同步组件了,嘎嘎。- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -...原创 2018-09-30 17:17:26 · 452 阅读 · 0 评论 -
ThreadLocal线程局部变量浅析
一、ThreadLocal的基本定义 官方定义:当使用 ThreadLocal 维护(set)变量时,ThreadLocal 为每个使用该变量的线程提供(get)独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal 并不是一个 Thread,而是 线程Thread的一个局部变量。 什...原创 2018-09-07 14:56:41 · 820 阅读 · 0 评论 -
常用的线程计数器CountDownLatch与CyclicBarrier
一、CountDownLatch类语法要点 (1)构造函数接收计数器的值。 (2)被计数的任务线程执行完毕后,记得调用一次 latch.countDown()方法,提示CountDownLatch对象,当前线程已经执行完毕。 (3)在需要等待多个任务执行完毕后,在需要同步的地方,使用 latch.await()方法进行阻塞。再次恢复任务执...原创 2018-09-05 10:52:19 · 490 阅读 · 0 评论 -
线程池ThreadPoolExecutor的使用
一、手动创建线程的缺点: (1)创建多个线程,会消耗许多内存。 (2)创建多个线程,也非常耗时。 (3)最重要的是,频繁创建线程,在任务执行完毕之后被回收,对GC也有一定的压力。二、线程池 线程池:创建线程变成了从线程池获取空闲的线程,关闭线程变成了向池子中归还线程。 合理地使用线程池能够带来三个好处:......原创 2022-02-23 11:13:34 · 20747 阅读 · 0 评论 -
原子操作类的使用
参考文章:https://blog.csdn.net/tlk20071/article/details/75729675一、自增:不加锁线程不安全public class AtomicDemo { //定义一个共享变量 private int value; //获取共享变量 public int getValue() { return ...原创 2018-09-13 17:37:27 · 436 阅读 · 0 评论 -
ReentrantReadWriteLock实现原理探索
一、读写锁基本特性 我们知道,对锁性能的优化其中有一条:如果操作互不影响,那么锁就可以被分离。这就是锁分离的思想。 ReentrantReadWriteLock可重入的读写锁。读写锁在同一时刻允许多个读线程访问,但是在写线程访问时,所有的读线程和其他线程均被阻塞。 ReentrantReadWriteLock内部有两把锁,一把读锁,一把写...原创 2018-09-14 16:36:12 · 422 阅读 · 0 评论 -
高性能ConcurrentHashMap集合源代码探索
一、为什么要用ConcurrentHashMap 经典讲解为什么并发不用HashMaphttps://blog.csdn.net/mydreamongo/article/details/8960667 你需要拥有的前置知识--HashMap源码解析:https://blog.csdn.net/yanluandai1985/article/details/79......原创 2018-10-15 11:33:18 · 448 阅读 · 0 评论 -
锁性能优化的几种思路
一、减少线程持有锁的时间 一个方法中,并不是所有的地方都需要同步。所以,只在需要同步的地方,进行加锁操作。 在代码中,可以把同步方法修改为同步代码块,可以减少线程持有锁的时间,从而提高性能。public synchronized void synMethod() { methodA();//不需要同步的A方法 me...原创 2022-02-23 11:13:53 · 2021 阅读 · 3 评论 -
异步调用--Future模式:返回伪造数据
一、Future模式的基本思想 如果某个方法的执行过程非常耗时,并且我们又不着急要这个方法的返回结果。 假设在单线程情况下,我们就必须要等待。 这个时候,可以修改此耗时的方法,让其立即返回客户端一个伪造的数据。 并且,在这个耗时的方法中开启另外一条线程,在后台慢慢计算。 主线程继续执行。 如...原创 2018-09-06 14:22:50 · 1325 阅读 · 0 评论 -
线程的状态
在 java.lang.Thread.State类中,定义了线程的状态。 线程的状态 New New状态是线程实例化后还没有执行start()方法的状态。new Thread().getState(); RUNNABLE 线程进入运行的状态。 即 Thread t1 = new Thread(); t1.sta...原创 2018-09-05 10:47:57 · 196 阅读 · 0 评论 -
Java 虚拟机对 synchronized 锁的优化
一、volatile 与 synchronized 关键字 的原理 Java代码首先会被编译成字节码文件。字节码文件被加载到JVM中,JVM将字节码翻译成汇编指令,从而在CPU中执行。 谈到volatile关键字,就会想到两点: (1)让变量在多个线程之间可见,并且强制线程从公共堆栈中取得变量的值(常见的从变量和线程的角度分别阐释)。...原创 2018-09-11 16:35:47 · 528 阅读 · 0 评论