摘要:
一线程活跃问题 1.线程安全的活跃性问题可以分为:死锁、活锁、饥饿。 活锁:有时线程虽然没有发生阻塞,但是仍然会存在执行不下去的情况,活锁不会阻塞线程,线程会一直重复执行某个相同的操作,并且一直失败重试。 出现的场景:异步消息队列有可能出现活锁问题,在消息队列的消费端如果没有正确的ack消息,并且执 阅读全文
摘要:
Java的线程有6种状态,它们定义在java.lang.Thread.State类中。 (1)NEW状态 是指线程刚创建, 尚未启动 (2)RUNNABLE状态(ready和running) 是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待 阅读全文
摘要:
创建线程的四种方式 (1)继承Thread类 (2)实现Runnable接口 (3)实现Callable接口 (4)使用线程池 1 package com.example.concurrency; 2 3 import java.util.concurrent.Callable; 4 import 阅读全文
摘要:
1.CPU密集型程序,一个完整请求,I/O操作可以在很短时间内完成,CPU还有很多运算要处理,也就是说CPU计算的比例占很大一部分,线程等待时间接近0。 单核CPU处理CPU密集型程序,不太适合使用多线程。 多核CPU理论上线程是数量为CPU(逻辑)核心数,但实际上,设置为CPU(逻辑)核心数+1。 阅读全文
摘要:
在代码种加入volatile关键字时,生成的汇编代码会出现一个locl前缀指令。 local前缀指令实际上相当于一个内存屏障,它有3个功能: 1.它确保指令重排序时不会把后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面。即在执行到内存屏障位置时,它前面的操作已全部完成。 2.它 阅读全文
摘要:
每个Thread都有一个ThreadLocal.ThreadLocalMap的map,该map的key为ThreadLocal实例,它为一个弱引用。 弱引用有利于GC回收。 弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。 在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了 阅读全文
摘要:
1.来源: lock是一个接口(interface)。 synchronized是java的一个关键字,它由内置的语言实现。 2.异常是否释放锁: lock发生异常时不会主动释放锁,必须手动unlock来释放,可能引起死锁。 synchronized发生异常时会自动释放锁,不会引起死锁。 3.是否响 阅读全文