多线程使用场景:如果有多个任务并且任务量巨大,使用多线程提高效率。
线程状态
:
线程安全:1.多个线程对共享资源同时进行操作,会造成线程安全问题。为了保证线程安全需要满足原子性,可见性,有序性。
解决方式:
1.synchroized?说一下
作用:基于对象头进行加锁,都同一个对象头加锁的线程同步互斥.
1.synchroized底层原理和实现:
mointor机制:基于mointor监视器,使用对象头锁的状态来进行加锁。;当使用javap反编译命令,会出现1个mointorenter+2个monitorexit这样的指令,多出来的monitorexit是因为catch异常也需要释放对象锁。;monitor存在计数器的实现:实现synchroized的可重入性。
2.jvm对synchrozied的优化: 基于对象头锁的状态来实现。从低到高(锁只能升级不能降级)
(1)无锁:
(2)偏向锁:同一个对象多次加锁。
(3)轻量级锁:基于cas实现,同一个时间点经常只有一个线程竞争。
(4)重量级锁:基于系统mutex锁实现,同一个时间点,有多个线程竞争。mutex锁是系统级别的锁,线程总是竞争失败,会多次由用户态转变为内核态,消耗大。
其他优化:
(1)锁粗化:多个synchroized连续加锁释放锁,可以合并为一个。如StingBuffer多次调用append方法
(2)缩消除:对不会逃逸到其他线程的变量,执行加锁操作,可以删除加锁。如StingBuffe在方法中多次调用append
死锁
出现的原因:至少两个线程,互相持有对方资源而没有进行资源释放,再次申请对方所持有的资源。
出现死锁的后果:至少两个线程相互阻塞等待对方资源。
如何检查死锁:使用jdk工具 jconsole 查看线程状态。
如何解决死锁:1资源一次性分配,2当线程满足条件时主动释放掉已占有的资源 3资源有序分配:系统为每个资源进行编号,每个线程按照编号请求递交资源,释放相反的顺序。
原子性并发包下的api
说一下多线程?
最新推荐文章于 2022-08-20 18:38:04 发布