[8]-并发

宏观:concurrent包

  • atomic包: AtmoicInteger
  • locks包:Lock、Condition、ReetrantLock

  • Callable、Future
  • Exector、ExecutorService
  • CountDownLatch、CyclicBarrier
  • ConcurrentHashMap


//AtmoicInteger
//(预期值,新值) 当前值==预期值,当前值=新值 
public final int getAndIncrement(){
    for(;;){
        int current=get();
        int next=current+1;
        if(compareAndSet(current,next)){
            return current;
        }
    }
}


线程池:threadPoolExector.execute

  • coreNum、maxNum、
  • ThreadFactory、BlockingQueue、
  • 饱和策略、时间、时间单位)

  • amount< coreNum:ThreadFactory创建线程
  • amount< maxNum
    • 阻塞队列未满:BlockingQueue阻塞队列
    • 阻塞队列已满:ThreadFactory创建线程
  • amount>=max
    • 谁提交请求、谁处理
    • 抛异常、catch处理
    • 丢了这个请求
    • 丢了队列最早请求

线程让出cpu

  • yield():就绪:让给相同/更高:t1.setPriority(1-10,5)
  • wait():阻塞:释放锁
  • sleep():阻塞:不释放锁
  • join():阻塞:main调用t1.join(),main阻塞,直到t1结束

中止一个线程

  • suspend():立刻、不释放锁

  • interrupt():只能用于阻塞态,抛InterruptedException异常

    • wait:等锁;sleep:立刻;join:立刻
  • stop()
    • run()不同步:释放锁、抛ThreadDeath、可能不一致
    • run()同步:stop()也是同步,得不到锁、无法中止

synchronized

  • 提供了与对象相关的隐式监视器锁的访问
  • 锁的获取和释放要出现在一个块结构中,锁的释放是隐式的
  • 获取多个锁时, 必须以相反的顺序释放
  • JVM 在生成线程转储时能够包括锁定信息

ReentrantLock

  • Lock机制必须显式、在finally释放:locl.unlock()
    • 锁的获取和释放不必要在同一个块中
    • 释放锁的顺序更加自由

都是可重入锁

  • 同一个线程多次试图获取它所占有的锁,请求会成功。
  • 当释放锁的时候,直到重入次数清零,锁才释放完毕。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值