java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码
wait()/notify()方法
await()/signal()方法
BlockingQueue阻塞隊(duì)列方法
PipedInputStream/PipedOutputStream
阻塞隊(duì)列的一個(gè)簡單實(shí)現(xiàn):
public class BlockingQueue {
private List queue = new LinkedList();
private int ?limit = 10;
public BlockingQueue(int limit){
this.limit = limit;
}
public synchronized void enqueue(Object item)throws InterruptedException ?{
while(this.queue.size() == this.limit) {
wait();
}
if(this.queue.size() == 0) {
notifyAll();
}
this.queue.add(item);
}
public synchronized Object dequeue() ?throws InterruptedException{
while(this.queue.size() == 0){
wait();
}
if(this.queue.size() == this.limit){
notifyAll();
}
return this.queue.remove(0);
}}
在enqueue和dequeue方法內(nèi)部,只有隊(duì)列的大小等于上限(limit)或者下限(0)時(shí),才調(diào)用notifyAll方法。如果隊(duì)列的大小既不等于上限,也不等于下限,任何線程調(diào)用enqueue或者dequeue方法時(shí),都不會(huì)阻塞,都能夠正常的往隊(duì)列中添加或者移除元素。
wait()/notify()方法
生產(chǎn)者的主要作用是生成一定量的數(shù)據(jù)放到緩沖區(qū)中,然后重復(fù)此過程。與此同時(shí),消費(fèi)者也在緩沖區(qū)消耗這些數(shù)據(jù)。該問題的關(guān)鍵就是要保證生產(chǎn)者不會(huì)在緩沖區(qū)滿時(shí)加入數(shù)據(jù),消費(fèi)者也不會(huì)在緩沖區(qū)中空時(shí)消耗數(shù)據(jù)。
要解決該問題,就必須讓生產(chǎn)者在緩沖區(qū)滿時(shí)休眠(要么干脆就放棄數(shù)據(jù)),等到下次消費(fèi)者消耗緩沖區(qū)中的數(shù)據(jù)的時(shí)候,生產(chǎn)者才能被喚醒,開始往緩沖區(qū)添加數(shù)據(jù)。同樣,也可以讓消費(fèi)者在緩沖區(qū)空時(shí)進(jìn)入休眠,等到生產(chǎn)者往緩沖區(qū)添加數(shù)據(jù)之后,再喚醒消費(fèi)者。
總結(jié)
以上是生活随笔為你收集整理的java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贝爷为什么不吃皮蛋?
- 下一篇: python默认深拷贝_Python 深