java多线程解说【贰拾】_多线程知识总结

本篇文章旨在对多线程的知识进行补充总结。

 

1.wait和sleep的区别

wait()是Object类的方法,是线程同步的手段之一。sleep是thread类的方法。区别:

1.wait()必须在synchronized同步块或方法里调用;

2.wait()会释放synchronized锁上的对象锁,sleep不会;

3.wait()形成的阻塞,只能在同一个对象锁的synchronized作用域中调用notify()/notifyAll()来唤醒,而sleep()只能等待定时醒来或interrupt打断;

 

2.线程池

使用Executors创造线程池时:

线程数不满corePoolSize时总是创建新线程来执行任务;

线程数高于corePoolSize且低于maxPoolSize时,如使用SynchronousQueue队列,将检查是否有空闲线程,如有则使用,如没有则创建新线程来执行任务;如使用BlockingQueue队列,则新任务进入队列等待(这意味着maxPoolSize失效,线程池大小不可能超过corePoolSize了);

线程数达到最大线程数时,如使用SynchronousQueue队列,则触发拒绝策略;如使用BlockingQueue队列,则尝试将任务入队,如队列已满,则触发拒绝策略;

SynchronousQueue是一种特殊的零长度阻塞队列

 

3.synchronized锁住的是什么

每个java对象在内存中都有一个对应的锁监视器monitor,用来储存锁标记。同一时刻只能有一个线程拥有这个锁标记(其实就是0和1),这个锁也成为内部锁。

当多个线程执行到synchronized的代码块,只有拥有指定对象monitor锁的线程才能进入临界区,其他线程将阻塞。

当synchronized是单独的方法块时,锁住的是括号内的对象;当修饰普通方法时,锁住的是这个方法的拥有者(即实现类的一个实例对象);当修饰静态方法或类时,锁住的就是这个类对象。

 

4.Lock和synchronized的区别

Lock有ReentrantLock实现,线程在获取Lock锁的时候不会阻塞锁,而是通过不停循环(自旋)重试,直到持有该Lock锁的线程释放。synchronized会阻塞。

ReentrantLock可重入,持有Lock锁的线程还可以继续加锁。synchronized不可以。

Lock可以搭配Condition创建多个不同的条件变量,灵活多样地控制线程的睡眠和唤醒。synchronized不可以。

ReentrantLock支持公平和非公平锁(获取锁时是否插队)。synchronized都是非公平锁。

 

5.线程安全容器总结

ConcurrentHashMap:在HashMap的基础上再加一层segment,每个segment上各应用一把锁。一定程度上减少了锁的竞争,也允许一定数量并发读写。

CopyOnWriteArrayList:适用读多写少场景,读操作不加锁,写操作复制出一个新的队列然后在新集合上修改,然后新集合替换老集合。

ConcurrentSkipListMap:并发的Treemap;

ConcurrentLinkedQueue:基于链表的非阻塞队列;

BlockingQueue:阻塞并发队列接口,提供可阻塞的put()和get()方法。调用put()时,如果队列满则阻塞当前线程,直到队列有空间;调用take()时,如果队列为空则阻塞线程,直到队列不空。

 

系列文章:

java多线程解说【壹】_什么是线程

java多线程解说【贰】_java内存模型

java多线程解说【叁】_Thread的常用API实现

java多线程解说【肆】_锁实现:wait()/notify()

java多线程解说【伍】_锁实现:ReentrantLock的实现

java多线程解说【陆】_锁实现:Condition的实现

java多线程解说【柒】_锁实现:Lock/Condition的例子

java多线程解说【捌】_锁实现:读写锁ReentrantReadWriterLock

java多线程解说【玖】_锁实现:LockSupport工具类

java多线程解说【拾】_12个原子操作类

java多线程解说【拾壹】_并发容器

java多线程解说【拾贰】_并发框架:Fork/Join

java多线程解说【拾叁】_并发框架:Future

java多线程解说【拾肆】_线程池

java多线程解说【拾伍】_并发工具类:CountDownLatch

java多线程解说【拾陆】_并发工具类:CyclicBarrier

java多线程解说【拾柒】_并发工具类:Semaphore

java多线程解说【拾捌】_锁的总结

java多线程解说【拾玖】_ThreadLocal总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值