![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
乁为
这个作者很懒,什么都没留下…
展开
-
CAS无锁自旋
CAS:Compare and Swap 比较并且交换 日常编码过程中,基本不会直接用到 CAS 操作,都是通过一些JDK 封装好的并发工具类来使用的,在 java.util.concurrent 包下 CAS是一种无锁算法,它的功能是判断内存某个位置的值是否为预期值,如果是则改为新值, 否则重新循环去执行这个操作(自旋),或者什么都不做,这个过程是原子的 在volatile int i = 0; i++中,volatile类型的读写是原子同步的,但是i++却不能保证同步性,我们该怎么呢? 可以..原创 2021-09-10 18:05:10 · 89 阅读 · 0 评论 -
锁优化方面
synchronized 细化 : 锁的代码越少越好,避开那些不相关的业务逻辑代码 synchronized 粗化 : 多次加锁操作在JVM内部也是种消耗,如果多个加锁可以合并为一个锁,就可减少不必要的开销 分段锁,分段锁也并非一种实际的锁,而是一种思想;ConcurrentHashMap是学习分段锁的最好实践。 主要是将大对象拆成小对象,然后对大对象的加锁操作变成对小对象加锁,增加了并行度 锁定某个对象o ,如果o的属性发生改变,不影响锁的使用 但是如果o变成另一个对象,则锁定的对象发生改变 应该避原创 2021-09-10 18:04:37 · 54 阅读 · 0 评论 -
Volatile关键字
1.保证线程可见性 不可见:两个线程 当一个线程操作这个值,其他线程不知道,用的还是原来的值 底层用了 cpu的缓存一致性协议 2.禁止指令重排序 不是禁止cpu的指令排序 单例:就是保证在JVM内存里,永远只有某一个类的一个实例 双重检查 , 加Volatile重点,不加Volatile 问题就会出现在指令重排序上,一般并发超高的时候才会出现 锁细化:加锁给少量代码,不用锁住一个方法 如果两个线程同时都判断 instance 为null了 ,一个线程加锁完释放掉后,另一个线程...原创 2021-09-10 18:04:00 · 79 阅读 · 0 评论 -
synchronized底层实现
synchronized 锁的是对象不是代码 锁定方法和非锁定方法可以同时执行 synchronized(Object){ -不能用String常量 ,Integer ,Long 等基础数据类型 } 因为 万一你把一个类库的值锁住了,别人也锁住了 会出现死锁 锁升级-- 偏向锁 :第一个 去访问某把锁的线程,是没有给Object加锁的,只记录这个线程的id 如果线程争用,升级为自旋锁 , 两个线程一个线程占着锁,另一个线程自旋 自旋锁:不会进入就绪队列,会一直占用cpu,自旋10...原创 2021-09-10 18:03:18 · 91 阅读 · 0 评论 -
synchronized
多个线程访问同一个资源的时候,需要对这个资源进行上锁 加锁:如果有线程想访问资源的时候,看这个锁是不是属于我,如果属于我才可以执行这段代码 锁的特性: public synchronized void m(){ //等同于在方法的代码执行时 要synchronized(this) } || public void m(){ synchronized(this){ //任何线程要执行下面的代码,必须先拿到this的锁 } } public synchronized sta...原创 2021-09-10 18:02:32 · 50 阅读 · 0 评论 -
线程的基本状态
这个不全 看看面试题 sleep:当前线程睡眠一段时间,让给别的线程去运行 yield:让出一下cpu,返回到就绪状态 join:等待另一个线程执行完 再继续执行现在的线程 一、new状态:new Thread(); 二、Runable 状态包括这两个: 1.Ready 就绪状态:就是我们把要执行的线程扔到等待队列里去,排着队,等着cpu运行 2.Running:线程被调度器选中执行,就是真正扔到cpu上运行的时候 Ready ---线程被调度器选中执行--->Running ...原创 2021-09-10 17:36:58 · 137 阅读 · 2 评论 -
什么是线程
什么是线程,什么是进程,--什么是协程/纤程: 程序:就是操作系统的一个 可执行文件 比如QQ.exe 进程:操作系统进行资源分配的基本单位 线程:在进程的内部,是调度执行的基本单位(多个线程之间共享这个分配的资源) 线程是在进程的内部,是进程的最小执行单位 程序是在硬盘上的,等他真正执行的时候,他会把这个文件的相关信息Load到内存里,叫做一个进程,就可以给他分配程序执行所需要的资源了, 一个程序可以有多个进程,真正开始执行的时候程序是以线程为基本单位开始执行,操作系统会找到这个进程的主线程 m.原创 2021-09-10 17:32:07 · 300 阅读 · 0 评论 -
多线程面试题
一、单核cpu设定多线程是否有意义: 有意义,打比方有一个程序,在运行,他里面有好多要执行的线程,但并不是所有的线程 都会一直消耗cpu,比如这个线程sleep了,那这段时间就可以让给别的线程运行,这样就能充分的利用cpu的资源 二、工作线程数是不是设置的越大越好? 不是,因为线程之间的切换也是需要消耗资源的 三、实现线程的五种方式: 带返回值的只需要有Future、Callable 或者 Futuretask就行 1、继承Thread...原创 2021-09-10 17:28:19 · 56 阅读 · 0 评论