资源描述
并发编程交流bluedavy2021-03-19AboutPPT对于Java体系而言主要还是借助多线程来做并发so下面的一切都是多线程相关点,不涉及多进程资源竞争和一致性Sun JDK提供的支持并发包值得学习的地方尽可能Nonblocking-例子线程线程交互线程池线程跟踪和问题查找线程调度Some tips资源竞争和一致性Sun JDK提供的支持SynchronizedSemaphore、CountdownLatchReentrantLock、ConditionAtomicInteger、ConcurrentHashMap、ArrayBlockingQueue资源竞争和一致性并发包值得学习的地方AtomicInteger系列CASConcurrentHashMap拆分锁Semaphore、CountdownLatch并发包中最强悍的类:AbstractQueuedSynchronizer基于和来操控线程是否可被调度基于队列来做等待看的也不是非常明白,需要懂的人分享下尽可能Nonblocking例子常见代码如下private static Map connections=new HashMap();public Connection get(String key)throws Exceptionsynchronized(connections)if(key)return(key);Connection conn=createConnection(key);(key,conn);return conn;尽可能Nonblocking例子改造想法connections改为ConcurrentHashMap借助putIfAbsent来减少判断是否存在的lockprivate static ConcurrentHashMap connections=new ConcurrentHashMap();public Connection get(String key)throws Exceptionif(key)return(key);Connection conn=createConnection(key);Connection realConn=(key,conn);if(realConn!=null)();return realConn;尽可能Nonblocking例子改造想法能否不创立无谓的连接,想到了FutureTaskprivate static ConcurrentHashMapString,FutureTask connections=new ConcurrentHashMapString,FutureTask();public Connection get(final String key)throws Exceptionif(key)return(key).get;FutureTask newTask=new FutureTask(new Callable()public Connection call()throws Exceptionreturn createConnection(key););FutureTask task=(key,newTask);if(task=null)();return();return();线程线程交互wait/notify(notifyAll)在测kilim一个版本时,高压力的情况下wait/notify貌似有bug,jdk是线程池ThreadPoolExecutor做的已经不错了,但要注意合理使用不要使用无限制大小的线程池最好自行实现ThreadFactory,最少给线程加上个前缀当超过coreSize后,会扔到指定的BlockingQueue中,因此要注意这个地方.线程线程跟踪和问题查找jstack、tda、visualvmjprofilerpstat+jstack直接查找耗cpu的线程线程调度最常见的问题在于必须是一个请求占据一个线程,无论这个请求中途是否要去远程访问、文件IO或锁等待;Coroutinemaybe是可以考虑的方案轻量级线程基于栈分析保存相关的上下文信息:会多消耗内存要求整个处理过程中不能有阻塞意味着锁、数据库访问、网络访问都得处理好Java中:Scala、KilimSome tips多线程后一定要考虑对资源的消耗,否那么搞不好性能反倒更差了CPUcpu切换是否太严重内存内存消耗是否严重,在网络通信中最明显性能尽可能Non-Blocking拆分锁隔离ReadWriteCopyOnWrite,允许读脏数据
展开阅读全文