说一下多线程?

多线程使用场景:如果有多个任务并且任务量巨大,使用多线程提高效率。

线程状态

:

线程安全: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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值