并发编程交流
Upcoming SlideShare
Loading in...5
×
 

并发编程交流

on

  • 7,039 views

杭州程序员并发编程交流PPT,活动地址:

杭州程序员并发编程交流PPT,活动地址:
http://hangzhou.koubei.com/huodong/10610100000004750

Statistics

Views

Total Views
7,039
Views on SlideShare
4,479
Embed Views
2,560

Actions

Likes
17
Downloads
395
Comments
0

11 Embeds 2,560

http://www.blogjava.net 1763
http://blog.bluedavy.com 436
http://bluedavy.com 256
http://bluedavy.me 56
http://www.slideshare.net 23
https://blog.bluedavy.com 10
http://localhost 9
http://xianguo.com 2
http://220.112.31.223 2
http://reader.youdao.com 2
http://zhuaxia.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

并发编程交流 并发编程交流 Presentation Transcript

  • 并发编程交流
    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,允许读脏数据