多线程 使用LinkBlockingQueue最好添加读写锁
以下示例,不加读写锁有可能线程C会出现输出为false的情况
添加以后则不会出现此种状况
package com.cy.BlockQueueDemo;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class LinkBlockingQueueDemo {
private static LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue();
private static ReentrantReadWriteLock.WriteLock writeLock = new ReentrantReadWriteLock().writeLock();
public static void main(String[] args) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+":"+queue.toString());
writeLock.lock();
for (int i = 1; i <= 10; i++) {
try {
Thread.sleep(1000);
queue.add(i);
System.out.println(Thread.currentThread().getName()+":"+queue.toString());
} catch (Exception e) {
System.out.println(e.getMessage());
;
}
}
writeLock.unlock();
System.out.println(Thread.currentThread().getName()+":"+queue.toString());
}, "Thread-A").start();
new Thread(() -> {
while(true){
try {
writeLock.lock();
if(queue.contains(5)){
System.out.println("come into "+Thread.currentThread().getName());
Thread.sleep(500);
queue.take();
System.out.println(Thread.currentThread().getName()+":"+queue.toString());
}
} catch (Exception e) {
System.out.println(e.getMessage());
;
}finally {
writeLock.unlock();
}
}
}, "Thread-B").start();
new Thread(() -> {
while (true) {
try {
writeLock.lock();
if(queue.contains(5)){
System.out.println("come into "+Thread.currentThread().getName());
Thread.sleep(5000);
boolean remove = queue.remove(5);
System.out.println(Thread.currentThread().getName()+":"+queue.toString());
System.out.println(remove);
}
writeLock.unlock();
} catch (Exception e) {
System.out.println(e.getMessage());
;
}
}
}, "Thread-C").start();
}
}
随机输出结果1:
Thread-A:[]
Thread-A:[1]
Thread-A:[1, 2]
Thread-A:[1, 2, 3]
Thread-A:[1, 2, 3, 4]
Thread-A:[1, 2, 3, 4, 5]
Thread-A:[1, 2, 3, 4, 5, 6]
Thread-A:[1, 2, 3, 4, 5, 6, 7]
Thread-A:[1, 2, 3, 4, 5, 6, 7, 8]
Thread-A:[1, 2, 3, 4, 5, 6, 7, 8, 9]
Thread-A:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Thread-A:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
come into Thread-B
Thread-B:[2, 3, 4, 5, 6, 7, 8, 9, 10]
come into Thread-B
Thread-B:[3, 4, 5, 6, 7, 8, 9, 10]
come into Thread-B
Thread-B:[4, 5, 6, 7, 8, 9, 10]
come into Thread-B
Thread-B:[5, 6, 7, 8, 9, 10]
come into Thread-B
Thread-B:[6, 7, 8, 9, 10]
随机输出结果2:
Thread-A:[]
Thread-A:[1]
Thread-A:[1, 2]
Thread-A:[1, 2, 3]
Thread-A:[1, 2, 3, 4]
Thread-A:[1, 2, 3, 4, 5]
Thread-A:[1, 2, 3, 4, 5, 6]
Thread-A:[1, 2, 3, 4, 5, 6, 7]
Thread-A:[1, 2, 3, 4, 5, 6, 7, 8]
Thread-A:[1, 2, 3, 4, 5, 6, 7, 8, 9]
Thread-A:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Thread-A:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
come into Thread-C
Thread-C:[1, 2, 3, 4, 6, 7, 8, 9, 10]