并发编程交流bluedavy2010-03-19
AboutPPT对于Java体系而言主要还是借助多线程来做并发so下面的一切都是多线程相关点,不涉及多进程资源竞争和一致性Sun JDK提供的支持并发包值得学习的地方尽可能Nonblocking--例子线程线程交互线程池线程跟踪和问题查找线程调度Some tips
资源竞争和一致性Sun JDK提供的支持SynchronizedSemaphore、 CountdownLatchReentrantLock、ConditionAtomicInteger、ConcurrentHashMap、ArrayBlockingQueue
资源竞争和一致性并发包值得学习的地方AtomicInteger系列CASConcurrentHashMap拆分锁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来减少判断是否存在的lockprivate 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例子改造想法能否不创建无谓的连接,想到了FutureTaskprivate 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、visualvmjprofilerpstat+jstack直接查找耗cpu的线程
线程调度最常见的问题在于必须是一个请求占据一个线程,无论这个请求中途是否要去远程访问、文件IO或锁等待;Coroutinemaybe是可以考虑的方案轻量级线程基于栈分析保存相关的上下文信息:会多消耗内存要求整个处理过程中不能有阻塞意味着锁、数据库访问、网络访问都得处理好Java中:Scala、Kilim
Some tips多线程后一定要考虑对资源的消耗,否则搞不好性能反倒更差了CPUcpu切换是否太严重内存内存消耗是否严重,在网络通信中最明显性能尽可能Non-Blocking拆分锁隔离(ReadWrite)CopyOnWrite,允许读脏数据
并发编程交流

并发编程交流