Java多线程总结(二)

1、wait和notifyhtml

Object.wait()令对象执行线程被暂停,进入WAITING状态java

Object.notify()是唤醒一个被暂停的线程数组

 

线程只有在持有对象内部锁的状况下才能wait(),wait()会释放锁线程

等待线程对保护条件的判断老是放到对象所引导的临界区中;判断,wait和目标动做必须放在同一个临界区中;wait()释放的锁只是当前wait方法所属对象的内部锁,当前线程其它内部锁,显示锁不释放htm

 

notify()也在临界区中,包含更新共享变量,唤醒线程两个动做。notify自己不会释放锁对象

notifyAll能够唤醒对象上全部等待线程blog

实现原理:每一个对象有一个入口集用以储存申请内部锁的线程,还有一个等待集存储等待线程,wait暂停并释放内部锁的同时会把当前线程的引用存在对象的等待集,notify唤醒时,线程仍停留在等待集,直到线程再次持有相应内部锁时wait会把线程从等待集中移除,而后wait的调用就反悔了接口

 

问题:过早唤醒,保护条件还未成立就唤醒了,这样会继续等待;信号丢失(代码错误),wait前没有判断保护条件,错过了信号而一直等待,或者该用notifyAll的地方用notify;上下文切换队列

 

join方法:wait和notify实现,检测到目标线程未结束就会调用wait,虚拟机会在目标线程run结束后调用该线程的notifyAll虚拟机

 

条件变量:java.util.concurrent.locks.Condition接口,定义了await()、sign()、signAll()方法,与 wait它们相似,要求对象持有显示锁,内部维护一个条件队列,解决提早唤醒的方式是变量和等待线程一对多

 

2、生产者消费者问题

3、线程池

https://www.cnblogs.com/aspirant/p/6920418.html

 

4、currentHashMap

JDK7中经过锁分段技术实现,ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色

JDK8 取消锁分段,改用CAS

相关文章
相关标签/搜索