Java多线程
文章平均质量分 80
黄泥川水猴子
焦虑没有用,得学习
展开
-
死锁的定义
一、什么是死锁?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于进程间推进顺序非法而造成的一种阻塞的现象二、产生死锁的原因?竞争资源产生死锁中的竞争资源之一指的是竞争不可剥夺资源(例如:系统中只有一台打印机,可供进程P1使用,假定P1已占用了打印机,若P2继续要求打印机打印将阻塞)产生死锁中的竞争资源另外一种资源指的是竞争临时资源(临时资源包括硬件中断、信号、消息、缓冲区内的消息等),通常消息通信顺序进行不当,则会产生死锁进程间推进顺序非法若P1保持了资源R1,P2保持了资源R2原创 2022-03-29 18:35:51 · 1057 阅读 · 0 评论 -
ThreadLoal
ThreadLocal是什么首先,它是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,每个ThreadLocal只能保存一个变量副本,如果想要上线一个线程能够保存多个副本以上,就需要创建多个ThreadLocal,各个线程的数据互不干扰。ThreadLocal<String> localName = new ThreadLocal();localName.set("占小狼");String name = local原创 2022-03-18 22:15:49 · 148 阅读 · 0 评论 -
控制并发线程数的Semaphore
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。应用场景Semaphore可以用于做流量控制,特别公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有十个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,我们就可以使用Semaphore来做流控原创 2022-03-17 08:29:18 · 544 阅读 · 0 评论 -
Java基础篇面经
correnthashmapthreadlocal 原理hashmapsyn 和 lock 的区别,哪个更好?怎么选择?hashmap 源码,为什么 8 个节点变成红黑树 又为什么到了 6 个节点才恢复为链表?一开始问有没有见过进程的 Z 状态,没答出来就问了,进程有哪些状态:答 新建 阻塞 运行 就绪 终结假设操作系统内存是 4GB,其中有 2.5GB 被 A 进程占用了,操作系统本身占用 0.5GB 内存,这时候如果 fork 了这个进程,是否能成功,为什么?终结状态和在操作系统里彻底原创 2022-03-16 22:59:06 · 688 阅读 · 1 评论 -
CountDownLatch理解
CountDownLatchCountDownLatch是JDK提供的一个同步工具,它可以让一个或多个线程等待,一直等到其他线程中执行完成一组操作。常用的方法有countDown方法和await方法,CountDownLatch在初始化时,需要指定用给定一个整数作为计数器。当调用countDown方法时,计数器会被减1;当调用await方法时,如果计数器大于0时,线程会被阻塞,一直到计数器被countDown方法减到0时,线程才会继续执行。计数器是无法重置的,当计数器被减到0时,调用await方法都会原创 2022-03-16 18:54:15 · 1538 阅读 · 0 评论 -
CAS原理
CAS算法理解对CAS的理解,CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS比较与交换的伪代码可以表示为:do{备份旧数据;基于旧数据构造新数据;}while(!CAS( 内存地址,备份的旧数据,新数据 )) 注:t1,t2线程是同时更新同一变量56的值因为t1和t2线程都同时去访问同一变量56,所以他们会把主内存的值完全拷贝一份到自己的工作内存空间,所以t1和t2线程原创 2022-03-14 11:18:47 · 145 阅读 · 0 评论 -
Java技术之AQS详解
AbstractQueuedSynchronizer简写为AQS,抽象队列同步器。它是一个用于构建锁和同步器的框架,许多同步器都可以通过AQS很容易并且高效的构造出来,以下都是通过AQS构造出来的:ReentrantLock, ReentrantReadWriteLockAQS使用了模板方法,把同步队列都封装起来了,同时提供了以下五个未实现的方法,用于子类的重写:boolean tryAcquire(int arg):尝试以独占模式进行获取。此方法应查询对象的状态是否允许以独占模式获取对象,如果.原创 2022-03-04 10:25:41 · 6545 阅读 · 2 评论 -
线程池原理
ThreadPoolExecutor提供了四个构造函数//五个参数的构造函数public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueu原创 2022-03-01 16:01:48 · 99 阅读 · 0 评论 -
java多线程的几种实现方式
1.继承Thread类,重写run方法Thread类本质上是实现了Runnable接口的一个实例。因此,启动线程的唯一方式就是通过Thread类的start()方法,start()方法是个native方法,它会启动一个新的线程,并执行run()方法。/** * Create By CodeCow on 2020/8/3. */public class TestThread { public static void main(String[] args) { MyThr..原创 2022-03-01 12:20:04 · 3818 阅读 · 0 评论 -
多线程面试题
为什么要使用多线程?提高系统资源利用率,多个线程同时运行,可以减少线程上下文切换开销,提高并发能力和CPU资源利用率。多线程实际中应用场景tomcat:tomcat内部采用多线程,上百个客户端访问同一个WEB应用,tomcat接入后就是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用我们的servlet程序,比如doGet或者dpPost方法自动作业处理:比如定期备份日志、定期备份数据库、定期清理数据库batch。线程安全问题多线程操作共享资源时,导致共享资源出现错乱。线程安全问题都是由原创 2022-02-18 09:05:44 · 221 阅读 · 0 评论 -
彻底搞懂Java中的synchronized关键字
synchronized的作用synchronized 的作用主要有三:原子性:所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。被synchronized修饰的类或对象的所有操作都是原子的,因为在执行操作之前必须先获得类或对象的锁,直到执行完才能释放。可见性:可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的。synchronized和volatile都具有可见性,其中synchronized对一个类或对象加锁时,一个线程原创 2022-02-18 02:04:51 · 1138 阅读 · 0 评论 -
ConcurrentHashMap原理基于JDK1.7源码
多线程高并发情况下,hashmap会出现问题。segment基本原理工作原理:中途多了一个寻找segment的过程,当两个线程同时进行时,如果计算的segement一样,其中一个segment.lock(),下一个就会等待上一个线程释放。源码初始化concurrencyLevel指的是并发级别(多少线程)这个变量决定segment对象多少 8–>8 9–>16initialCapacity是所有entry加一起的数量 c是segment中entry的数量用initia.原创 2022-01-25 11:27:49 · 409 阅读 · 0 评论 -
volatile关键字的有序性
volatile通常被比喻成"轻量级的synchronized",也是Java并发编程中比较重要的一个关键字。和synchronized不同,volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。volatile保证有序性的原理为了性能优化,JVM会在不改变数据依赖性的情况下,允许编译器和处理器对指令序列进行重排序,而有序性问题指的就是程序代码执行的顺序与程序员编写程序的顺序不一致,导致程序结果不正确的问题。而加了volatile修饰的共享变量,则通过内存屏障解决了多线程下有.原创 2021-12-16 16:16:48 · 295 阅读 · 0 评论 -
volatile可见性&MESI协议&volatile
可见性当一个线程修改了共享变量后,其他线程能够立即得知这个修改。可见性的定义比较简单,那怎么去实现呢?一般来说可见性会通过缓存一致性协议来完成CPU A 计算完成后发指令需要修改x.CPU A 将x设置为M状态(修改状态)并通知缓存了x的CPU B, CPU B将本地cache b中的x设置为I状态(无效状态)CPU A 对x进行赋值CPU B 发现x是失效的这个时候会进行回刷操作可以看见我们的一致性协议会有一定的时间延迟,但是我们的可见性的目的是立即读到最新的,所以我们这里会将无效状态通知原创 2021-12-13 11:04:23 · 1327 阅读 · 1 评论