
java之多线程学习笔记
文章平均质量分 61
离别又见离别
只要继续走,总会到达自己的目的地
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
多线程之保证线程安全技术(二十五)
1. 局部变量使得我们不必借助锁的的情况下来保障线程安全,可以避免锁导致的问题和开销java运行时空间可以分为栈区,堆区和方法区(非堆空间)栈空间)(Stack Space),为线程的执行准备一段固定大小的存储空间,每个线程都有独立的线程栈空间,创建线程时就为线程分配栈空间,在线程栈中没调用一个方法就给方法分配一个栈帧,栈帧用于存储方法的局部变量,返回值等私有数据,即局部变量存储在栈空间中,基本类型变量也是存储在栈空间中,饮用类型变量值也是存在栈空间,引用的对象在堆中,由于线程是相互独立的,一个线原创 2021-03-16 10:14:47 · 177 阅读 · 0 评论 -
多线程之 ForkJoinool线程池(二十四)
"分而治之"的一个有效的处理大数据的方法,著名的MapReduce就是采用这种分而治之的思路,简单点生活如果要处理的1000个数据,但是我们不具备处理1000个数据的能量,可以处理10个数据,可以把这个1000个数据分阶段处理100次,每次处理10个,吧100次的处理结果进行合成,形成最后的1000个数据的处理结果把一个大任务调用fork()方法分解为若干个小任务,把小任务的处理结果进行join()合并为大任务的结果系统对ForkJoinPool线程池进行了优化,提交的任务数量与线程的数量不一定是一对原创 2021-03-16 10:11:20 · 202 阅读 · 0 评论 -
多线程之ThreadFactory线程工厂(二十三)
线程池中的线程从哪儿来的?答案就是ThreadFactoryThreadFactory是一个接口,只有一个用来创建线程的方法:Thread newThread(Runnabke r)当线程池中需要创建线程的时候调用该方法一、包含自定义线程池dome:package com.dome.threadpool;import java.util.Random;import java.util.concurrent.*;/** * @author qb * @version 1.0 *原创 2021-03-16 10:08:06 · 798 阅读 · 0 评论 -
多线程之线程池(二十二)
一、什么是线程池可以以 new Thread(() ->{线程执行的任务}).start();这种形式开启一个线程,当run()方法运行结束,线程对象会被GC释放在真实的生产环境中,可能需要很多的线程来支撑整个应用,当线程数量非常多是,反而会好紧cpu资源,如果不对线程进行控制和管理反而会影响程序的性能,线程的开销主要包括:创建与启动线程得开销;线程销毁的开销;线程调度的开销;线程数量受限CPU处理器的数量线程池就是有效使用线程的一种常用方式.线程池内部可以预先创建一定数量的工作线程,客户原创 2021-03-16 09:59:45 · 107 阅读 · 0 评论 -
多线程之注入hook钩子线程(二十一)
现在很多的软件包括MySql,Zookeeper,Kafka等都存在hook线程的校验机制,目的是校验进程是否已>经启动,防止重复启动我们的程序Hook线程也称为钩子线程,当JVM推出的时候他会执行hook线程。经常在程序启动的时候创建一个.lock文件,用.lock文件校验程序是否启动,在程序退出(JVM退出时)在删除该.lock文件,在hook线程中除了防止重新启动进程外,还可以做资源释放,尽量避免在hook线程中复杂的操作domepackage com.dome.hook;im.原创 2021-03-16 09:50:27 · 413 阅读 · 0 评论 -
多线程之 线程组(十九)
介绍类似于在计算机中使用文件夹管理,也可以使用线程组来管理线程,在线程组中定义一组相似的线程,在线程组中也可以定义子线程组Thread类有几个构造方法允许在创建线程时指定线程组,如果在创建线程时没有指定线程组则该线程就属于服线程所在的线程组。JVM在创建main线程时会为它指定一个线程组,因此每个java线程都有一个线程组与它关联,可以地调用线程的getThreadGroup方法返回线程组线程组开始是处于安全的考虑,设计用来区分不同的Applet,然而ThreadGroup并没有实现这个目原创 2021-03-12 16:21:06 · 136 阅读 · 0 评论 -
多线程之读写锁(十八)
synchronized内部锁与ReentrantLock锁都是独占锁(排它锁),同一时间只允许一个线程执行同步代码块,可以保证线程的安全性,但是执行效率低。ReentrantReadWriteLock读写锁是一种改进的排它锁,也可以称作共享/排它锁,语序多个线程同时读取共享数据,但是一次只允许一个线程对共享数据进行更新读写锁通过读锁和写锁;来完成操作,线程在读取共享数据前,必须先持有读锁,该读锁可以同时被多个线程持有,即他是共享的,写锁是排他的,线程在更新共享数据前必须先持有写锁,一个线程持有写锁.原创 2021-03-12 16:18:29 · 396 阅读 · 0 评论 -
多线程之ReentrantLock的基本方法使用(十七)
1.getHoldCount方法返回当前线程调用lock()方法的次数package com.dome.lock.method;import java.util.concurrent.locks.ReentrantLock;/** * @author qb * @version 1.0 * @Description * getHoldCount * @date 2021/3/11 14:16 */public class Test02 { static Reentr原创 2021-03-12 16:11:03 · 458 阅读 · 0 评论 -
多线程之公平锁与非公平锁(十六)
大多数情况下,锁的申请都是非公平的,如果线程1与线程2都在请求锁A,当锁A可用时,系统只是会从阻塞队列中随机的选择一个线程,不能保证其公平性。公平的锁会按照时间先后顺序,保证先到先得,公平锁的这一特点不会出现线程饥饿。synchronized内部锁就是非公平的,ReentrantLock重入锁提供一个构造方法:ReentrantLock(boolean fair),当在创建锁对象时,实参传递true可以把该锁设置为公平锁公平锁看起来很公平,但是要实现公平锁必须要求系统维护一个有序队列,所以公平锁的..原创 2021-03-12 16:04:29 · 241 阅读 · 0 评论 -
多线程之Condition(十五)
关键字synchronized与wait/notify这两个方法一起使用,可以实现等待/通知模式。lock锁的newCondition()方法会返回Condition对象,Condition类也可以实现等待/通知模式。使用notify通知时,JVM会随机唤醒某个等待的线程,使用Condition类可以进行选择行通知。Condition比较常用的两个方法:await()会使当前线程等待,同时会释放锁,当其他线程调用signal()时,线程会重新获得锁行继续执行.signal()用于唤醒一..原创 2021-03-12 16:02:27 · 169 阅读 · 0 评论 -
多线程之 Lock(十四)
ReentraantLock调用lock方法,获得锁,调用unlock方法释放锁一、lock的基本使用相当于同步代码块实现线程同步与同步代码块synchronized一样,但是锁要是一把锁package com.dome.lock.reentrant;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author qb * @versi.原创 2021-03-12 15:55:14 · 151 阅读 · 0 评论 -
多线程之锁(十三)
在JDK5中增加了Lock锁接口,有ReentrantLock实现类,ReentrantLock锁称为可重入锁,它功能比synchronized多锁的可重入性:锁的可重入是指,当一个线程获得一个对象锁后,再一次请求该对象锁时,是可以获得该对象的锁的.domepackage com.dome.lock.reentrant;/** * @author qb * @version 1.0 * @Description * 锁的可重入性 * @date 2021/3/11 9:18 */p原创 2021-03-12 15:42:40 · 128 阅读 · 0 评论 -
多线程之ThreadLocal(十二)
除了控制资源的访问外,还可以增加资源的方式来保障线程的安全,ThreadLocal主要解决为每个线程绑定自己的值。一、基本使用 domepackage com.dome.ThreadLocal;/** * @author qb * @version 1.0 * @Description * ThreadLocal基本使用 * * 各自变量互不干涉 * @date 2021/3/10 22:01 */public class Test { //定义ThreadLoc.原创 2021-03-12 15:38:54 · 113 阅读 · 0 评论 -
多线程之通过管道实现线程间的通信(十一)
在java.IO包中的PipeStream管道流,用于在线程之间传送数据,一个线程发送数据到输出管道,另一个线程从输入管道中读取数据.相关的类包括:字节流 PipeInputSteam 和PipeOutPutStream字符流 PipeReader和PipeWritedomepackage com.dome.PipeStream;import java.io.IOException;import java.io.PipedInputStream;import java.io.原创 2021-03-12 15:33:38 · 299 阅读 · 0 评论 -
多线程之生产者消费者模式(十)
在java中,负责产生数据的模块是生产者,负责使用数据的模块是消费者,生产者消费者解决数据的平衡问题,即要先有数据才能使用,没有数据时,消费者需要等待。生产-消费 ->操作数据操作栈一、简单实现ValueOp 数据类package com.dome.producerdata;/** * @author qb * @version 1.0 * @Description * 定义一个操作数据的类 * @date 2021/3/10 20:46 */public cla.原创 2021-03-12 15:31:42 · 96 阅读 · 0 评论 -
多线程之等待通知机制(九)
一 什么是等待通知机制在单线程编程中,要执行的操作需要满足一定的条件才能执行,可以把这个操作放在if语句中。在多线程中,可能A线程的条件没有满足只是暂时的,稍后其他的线程B可能会更新条件使得A线程的条件得到满足,可以将A线程暂停,直到他的条件得到满足后,我们在将A线程唤醒。他的伪代码: atomics{//原子操作 while(条件不成立){ //等待}//条件满足后,当前线程被唤醒,就继续执行下面的操作}二、 等待通知机制实现Object类中的wait()方法,可以使当前代码原创 2021-03-11 12:25:30 · 343 阅读 · 0 评论 -
多线程之原子变量(八)
什么是原子变量原子变量类基于CAS实现的,当对共享变量进行read-modify-write更新操作时,通过原子变量类可以保障操作的原子性与可见性,对变量的read-modify-write更新操作是指当前操作不是一个简单的赋值,而是变量的新值依赖变量的旧值,如自增操作i++,由于volatile只能保证可见性,无法保障原子性,原子变量类的内部就是借助一个volatile变量,并且保障了该变量的read-modify-write操作的原子性,优势把原子变量类看做增强的volatile变量原子变量类.原创 2021-03-09 17:51:06 · 401 阅读 · 0 评论 -
多线程之CAS(七)
CAS介绍CAS(Compare And Swap) 是由硬件实现的CAS可以将read-modify-write这类操作转换为原子操作i++自增操作包括三个自操作:1.从主内存读取i变量值2.对i的值加i3.再把加1之后的值保存到主内存CAS原理: 把数据更新到主内存时,在此读取主内存变量的值,如果现在变量的值与期望的值(操作起始时读取的值)一样就更新一:使用CAS实现线程安全的计数器1.CASTest01package com.dome.CASTest;/** * @auth原创 2021-03-09 17:30:29 · 202 阅读 · 0 评论 -
多线程之volatile(六)
补充:线程产生异常 ,线程会自动销毁 ,锁对象也会释放,其他线程正常执行死锁:原因:在多下线程程序中,同步时可能需要使用多个锁,如果获得的锁的顺序 补一张纸,可能会导致死锁如何避免: 当需要获取多个琐时,让他们获得锁的顺序都一样1.volatile 的作用使多个变量在多个线程之间可见,volatile的作用可以强制线程从公共内存中读取变量的值,而不是从工作内存中读取实例一package com.dome.volatileTest;/** * @author qb * @.原创 2021-03-09 17:21:02 · 137 阅读 · 0 评论 -
多线程之脏读(五)
脏读解释:脏读 --> 读取属性出现意外,读取的是中间值原因: 对共享数据与对共享数据的读取不同步,就可能会出现脏读举例package com.dome.test;/** * @author qb * @version 1.0 * @Description 脏读 --> 读取属性出现意外,读取的是中间值 * * 原因是: 对共享数据与对共享数据的读取不同步,就可能会出现脏读 * @date 2021/3/8 22:06 */public class test04原创 2021-03-09 10:16:00 · 208 阅读 · 0 评论 -
多线程之synchronzied同步代码块(四)
1.synchronzied同步代码块 this指向默认当前实例,如果声明地方法为static则是同步静态方法,同步实例代码块就不举例了,只要是同一实例,执行方式是按顺序执行不是并发执行1.) 静态方法代码块和实例类代码块代码public class test02 { public static void main(String[] args) { final test02 test01 = new test02(); new Thread(new Run原创 2021-03-09 09:48:35 · 175 阅读 · 0 评论