![](https://img-blog.csdnimg.cn/20200918082658736.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程
并发编程
程序员卡卡西
架构就是取舍
展开
-
Java多线程——Thread
Java 线程采用的是单线程编程模型,程序会自动创建主线程,主线程可以创建子线程,主线程原则上要后于子线程完成执行。需要注意的是,JVM 线程是多线程的,JVM 实例在创建的时候会同时创建很多线程,例如垃圾收集器的线程等。由于进程有独立的地址空间,而线程没有,所以多进程的程序比多线程的程序要健壮,但是进程的切换比线程的切换开销大,所以多线程比多进程拥有更高的性能。...原创 2020-08-10 17:13:24 · 221 阅读 · 0 评论 -
Java多线程——JMM内存模型
JMM(Java 内存模型)是一种抽象的概念,并不真实存在,它描述的是一组围绕原子性、有序性、可见性的规范Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面将的处理器的高速缓存类比),线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成。常见问题volatile 变量为何立即可见?原创 2020-08-09 14:03:55 · 151 阅读 · 0 评论 -
Java 多线程——JUC 包
JUC 包(java.util.concurrent)提供了并发编程的解决方案,CAS 是 java.util.concurrent.atomic 包的基础,AQS 是 java.util.concurrent.locks 包以及一些常用类比如 Semophore,ReentrantLock 等类的基础。JUC 包的分类:executor:线程执行器locks:锁atomic:原子变量类tools:并发工具类collections:并发集合...原创 2020-08-09 00:03:56 · 359 阅读 · 0 评论 -
Java多线程——Synchronized
在 Java 多线程编程中,造成线程安全问题的原因主要是由于存在多条线程共同操作共享数据。解决线程安全问题的根本办法就是同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再对共享数据进行操作。此时便引出了互斥锁,互斥锁的特性:互斥性(操作的原子性):即在同一时间只允许一个线程持有某个对象锁;可见性:在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另外一个线程是可见的。synchronized同步锁对象锁对象锁主要有两种用法:1.同步代码块,synchroni原创 2020-08-08 09:54:35 · 175 阅读 · 0 评论 -
Java多线程——AQS
在 Java 并发包中很多锁都是通过 AQS 来实现加锁和释放锁的过程的,AQS 就是并发包基础。例如 ReentrantLock、ReentrantReadWriteLock 底层都是通过 AQS 来实现的。AQS 内部其实就包含了三个组件:state 资源状态(volatile修饰,保证变量可见性)exclusiveOwnerThread 持有资源的线程;CLH 同步等待队列。加锁实现线程 1 过来通过 lock.lock() 方式获取锁,获取锁的过程就是通过 CAS 操作 volat原创 2020-08-08 09:27:03 · 168 阅读 · 0 评论 -
Java多线程——CAS与原子操作类
像 synchronized 属于悲观锁,CAS(Compare and Swap,比较并交换)则属于乐观锁,是一种高效实现线程安全性的方法,支持原子更新操作,适用于计数器等场景。CAS 操作失败时由开发者决定是继续尝试,还是执行别的操作,因此支持失败的线程不会被阻塞挂起。CAS原理CAS 机制使用了 3 个基本操作数:内存地址 V,预期原值 A 和新值 B。更新一个变量的时候,只有当变量的预期原值 A 和内存地址 V 当中的实际值相同时,才会将内存地址 V 对应的值修改为 B,否则 CPU 不做任何原创 2020-08-08 09:07:12 · 122 阅读 · 0 评论 -
Java多线程——线程池
核心组成corePoolSize:指定了线程池中的线程数量。maximumPoolSize:指定了线程池中的最大线程数量。keepAliveTime:当前线程池数量超过 corePoolSize 时,多余的空闲线程的存活时间,即多次时间内会被销毁。unit:keepAliveTime 的单位。workQueue:任务队列,被提交但尚未被执行的任务。threadFactory:线程工厂,用于创建线程,一般用默认的即可。handler:拒绝策略,当任务太多来不及处理,如原创 2020-08-07 18:17:17 · 425 阅读 · 1 评论