• 用Lock 和Newcondition实现同步容器 java


    package interview;
    
    import java.util.LinkedList;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    
    
    
    /*
     * 写一个固定容量同步容器,拥有put和get方法,以及getCount方法
     * 
     * 使用Lock和Condition来实现
     * 对比两种方式,Condition的方式可以更加精确的指定哪些线程被唤醒
     */
    
    public class ProducerConsumer<T> {
    	
    
    	final private LinkedList<T> list = new LinkedList<>();
    	final private int MAX=10;
    	private int count=0;
    	private Lock lock = new ReentrantLock();
    	private Condition producer = lock.newCondition();
    	private Condition consumer = lock.newCondition();
    	
    	
    	public void put(T t) {
    		lock.lock();
    		try {
    			while(list.size()==MAX) {
    				producer.await();
    			}
    			list.add(t);
    			++count;
    			consumer.signalAll();
    		}catch(Exception e) {
    			
    		}finally {
    			lock.unlock();
    		}
    	}
    	public T get() {
    		T t=null;
    		lock.lock();
    		try {
    			while(list.size()==0) {
    				consumer.await();
    			}
    			t = list.removeFirst();
    			count--;
    			producer.signalAll();
    		}catch(Exception e) {
    			
    		}finally {
    			lock.unlock();
    		}
    		return t;
    	}
    	
        public static void main(String[] args) {
    		ProducerConsumer<String> pc = new ProducerConsumer<>();
    		
    		//消费者线程
    		for(int i=0;i<10;i++) {
    			new Thread(() -> {
    				for(int j=0;j<5;j++) {
    					System.out.println(pc.get());
    				}
    			},"c"+i).start(); 
    		}
    		try {
    			TimeUnit.SECONDS.sleep(2);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		
    		//生产者线程
    		for(int i=0; i<2;i++) {
    			new Thread(() -> {
    				for(int j=0;j<25;j++) {
    					pc.put(Thread.currentThread().getName()+" "+j);
    				}
    			},"p"+i).start();
    		}
    		
    	}
    }
    
  • 相关阅读:
    leetcode_24. 两两交换链表中的节点
    Mysql大数据量分页优化
    MySQL 默认排序是什么
    spring注入map,spring注入一个接口的多个实现类在map里
    eureka缓存细节以及生产环境的最佳配置
    MySQL 5.7性能调优
    安装后的十个MySQL性能调整设置(版本:5.1、5.5 和5.6)
    docker部署tomcat应用和MySQL数据库
    MySQL热备工具Xtrabackup
    MySQL数据库的冷备方式
  • 原文地址:https://www.cnblogs.com/QAZLIU/p/9382102.html
Copyright © 2020-2023  润新知