`
thecloud
  • 浏览: 882800 次
文章分类
社区版块
存档分类
最新评论

并发相关

 
阅读更多

今天看到一篇文章,和我看《Thinking in java》时的笔记很相似,便转过来了,作为《Thinking in java》并发这一块的总结

转自:http://wangyang0311.iteye.com/blog/707894

1:实现Runnable接口并编写run()方法
2:Thread.yield()的含义是对线程调度器的一种建议,通常是切换线程
3:ExecutorService是具有生命周期的Executor,CachedThreadPool为每个任务创建一个线程,而FixedThreadPool使用了有限的线程集来执行任务,SingleThreadExecutor是数量为1的FixedThreadPool
4:Callable接口能在任务完成时返回一个值
5:Executor的submit()方法会产生Future对象,isDone()检查该对象是否完成,get()获取结果
6:Thread可以用setPriority()方法调整优先级,有MAX_PRIORITY,NORM_PRIORITY,MIN_PRIORITY
7:在启动之前调用线程的setDaemon(true)方法可以将其设置为后台线程,isDaemon()方法确定线程是否是后台线程,任何后台线程创建的线程都是后台线程
8:某线程在另一个线程t上调用t.join(),则此线程将被挂起,直到目标线程t结束才恢复,即t.isAlive()返回为假,或者在join()上带一个超时参数
9:使用并发时,将域设为private非常重要,因为synchronized关键字不能防止其他任务直接访问域
10:Brain同步规则:如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步,并且读写线程都必须用相同的监视器锁同步
11:Lock对象相比synchronized缺乏优雅但更加灵活,ReentranLock允许尝试获取但最终未获取锁,以便决定是否执行其他任务
12:宁愿使用同步控制块而不是对整个方法进行同步控制,使得其他线程能更多的访问
13:ThreadLocal对象为每个单独线程分配自己的存储,不会出现竞争条件
14:新的concurrent类库避免对Thread对象的直接操作,尽量通过Executor来执行所有操作,由submit()返回的Future对象,调用cancel(true)方法可以终端由Executor启动的单个线程
15:能中断sleep()的调用,不能中断I/O操作或synchronized锁
16:无论何时,只要任务以不可中断的方式被阻塞,都有潜在锁住程序的可能,而ReentranLock上阻塞的任务具有可以被中断的能力,这与用synchronized阻塞任务完全不同
17:调用notifyAll()比调用notify()更安全,反之则是一种优化
18:同步队列是比wait()和notifyAll()高级的协作,java.util.BlockingQueue接口提供了该队列,可以使用LinkedBlockingQueue(无界)或者ArrayBlockingQueue(固定大小),同步队列在任何时刻只允许一个任务插入或移除元素
19:CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行地执行工作,然后在进行下一个步骤前等待,直至所有任务完成(有点像join),非常像CountDownLatch,只是后者是触发一次的事件,而CyclicBarrier可以多次重用。(赛马游戏)
20:DelayQueue,有序无界BlockingQueue,到期才能取走对象;PriorityBlockingQueue,优先级队列
21:ScheduledThreadPoolExecutor设置计划的运行时间
22:Semaphore允许n个任务同时访问资源
23:Exchanger使得两个对象互换栅栏
24:ReadWriteLock对不频繁写入,频繁读出情况进行优化
25:原子类:AtomicInteger,AtomicLong,AtomicReference
26:免锁容器:ConcurrentHashMap,CopyOnWriteArrayList

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics