zoukankan      html  css  js  c++  java
  • 【JAVACONCURRENT】 阻塞容器处理锁细化

    package concurrentTest;
    
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    
    public class SingletonMode {
    
     private static ConcurrentHashMap<String,FutureTask<T_T>> taskMap = new ConcurrentHashMap<String,FutureTask<T_T>>();
     private static CyclicBarrier barrier = new CyclicBarrier(50);
     private static boolean signal = true;
     private static final String KEY = "KEY";
     
     public static void main(String[] args) throws InterruptedException, ExecutionException {
      
      for(int i=0;i<100;i++){
       Thread thread = new Thread(new Runnable(){
    
        @Override
        public void run() {
         
         T_T t_t = null;
         try {
          t_t = O_O(KEY);
         } catch (InterruptedException e) {
          e.printStackTrace();
         } catch (ExecutionException e) {
          e.printStackTrace();
         }
         System.out.println(Thread.currentThread().getId() + "  " + t_t.getO_0());
        }
        
        public T_T O_O(String key) throws InterruptedException, ExecutionException{
         
         try {
          barrier.await();
         } catch (BrokenBarrierException e) {
          e.printStackTrace();
         }
         FutureTask<T_T> futureTask = taskMap.get(key);
         if(futureTask != null){
          System.out.println(Thread.currentThread().getId() + " 被阻塞到这里了.1");
         }else{
          futureTask = new FutureTask<T_T>(new Task(key));
          FutureTask<T_T> beforeTask = taskMap.putIfAbsent(key, futureTask);
          if(beforeTask == null){
           beforeTask = futureTask;
           beforeTask.run();
           signal = false;
          }else{
            futureTask = beforeTask;
          }
          if(signal)
           System.out.println(Thread.currentThread().getId() + " 被阻塞到这里了.2");
         }
         return futureTask.get();
        }
        
       });
       thread.start();
      }
     }
     
    }
    
    class Task implements Callable<T_T>{
     
     private String t;
     
     public Task(String t){
      this.t = t;
     }
    
     @Override
     public T_T call() throws Exception {
      return new T_T(t);
     }
    }
    
    class T_T{
     
     private String o_0;
     
     public String getO_0() {
      return o_0;
     }
    
     public void setO_0(String o_0) {
      this.o_0 = o_0;
     }
    
     public T_T(String o_0){
      
      try {
       Thread.currentThread().sleep(1000L);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      System.out.println(Thread.currentThread().getId() + " do it le");
      this.o_0 = o_0;
     }
    }
  • 相关阅读:
    Java笔记6之三目运算符
    java笔记5之逻辑运算符以及&&与&的区别
    SAP CRM OData模型里的addressable为true的含义
    SAP CRM OData multiple origin Composition的测试
    重构老系统遗留代码的一些方法学习笔记
    SAP CRM系统里的附件存储逻辑
    如何用Postman创建SAP CRM的Opportunity业务数据
    另一种使用SAP SAT事务码对通过浏览器启动的应用的性能测量和分析方式
    SAP Hybris Commerce,CRM和C4C的登录语言选择
    SAP Hybris Commerce的页面路由实现
  • 原文地址:https://www.cnblogs.com/lixusign/p/2557501.html
Copyright © 2011-2022 走看看