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