zoukankan      html  css  js  c++  java
  • 双重校验锁模式【其他模式】

    @Slf4j
    public class DoubleCheckedLock {
    
    	/**
    	 * 双重校验锁模式可以避免多线程竞争时,无谓的资源消耗
    	 */
    	@Test
    	public void all() throws InterruptedException {
    		final LimitedList<String> list = new LimitedList<>(1);
    		final CountDownLatch latch = new CountDownLatch(1);
    		final ExecutorService threadPool = Executors.newFixedThreadPool(3);
    		for (int i = 0; i < 3; i++) {
    			threadPool.submit(() -> {
    				try {
    					latch.await();
    				} catch (final InterruptedException e) {
    					log.error("failed", e);
    				}
    				list.add(Thread.currentThread().getName());
    			});
    		}
    		latch.countDown();
    		TimeUnit.SECONDS.sleep(3);
    	}
    }
    
    @Data
    @Slf4j
    class LimitedList<E> {
    	private final int maxSize;
    	private final List<E> container;
    	private final Lock lock;
    
    	public LimitedList(int maxSize) {
    		super();
    		this.maxSize = maxSize;
    		this.container = Lists.newArrayListWithCapacity(maxSize);
    		this.lock = new ReentrantLock();
    	}
    
    	public boolean add(E e) {
    		// 第一重校验
    		if (container.size() < maxSize) {
    			try {
    				final String name = Thread.currentThread().getName();
    				log.info("{} block1", name);
    				lock.lock();
    				log.info("{} block2", name);
    				// 锁定后的第二重校验
    				if (container.size() < maxSize) {
    					log.info("{} block3", name);
    					container.add(e);
    					return true;
    				}
    			} finally {
    				lock.unlock();
    			}
    		}
    		return false;
    	}
    }
    
  • 相关阅读:
    32位和64位的区别
    Git--版本管理的使用及理解
    Maven使用详解
    记录centos7下tomcat部署war包过程
    SSM三大框架整合教程
    Mybatis 框架搭建实例
    Eclipse 出现select type (? = any character,*= any String,Tz=TimeZone)
    JDBC 操作数据库实例
    mysql 常用命令语法
    MySQL下载安装详情教程(Windows)
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10171026.html
Copyright © 2011-2022 走看看