《实战Java高并发程序设计》读书笔记

有助于提高锁性能的几点建议

1、减少锁持有的时间——–只在必要时进行同步

2、减小锁的粒度
ConcurrentHashMap(只有获取全局信息的方法调用不频繁时,这种方法才能真正意义上提高系统吞吐量)

3、读写分离锁替代独占锁——–ReadWriteLock

4、锁分离的思想——–LinkedBlockingQueue take()、put()使用不同的锁

5、锁粗化

虚拟机在遇到一连串连续地对同一锁不断进行请求和释放的操作时,便会把所有的锁操作整合成对锁的一次请求,从而减少对锁的请求同步次数。

例如:

public void demoMethod(){
   synchronized(lock){
       //do sth
   }
   //做其他不需要同步的工作,但能很快执行完毕
   synchronized(lock){
       //do sth
   }
}

会被整合成:

public void demoMethod(){
   //整合成一次锁请求
   synchronized(lock){
       //do sth
      //做其他不需要同步的工作,但能很快执行完毕
   }
}

还有在循环内请求锁的时候,有必要对锁进行粗化:

for(int i=0;ii++){
   synchronized(lock){
       //do sth
   }
}

一种更加合理的做法应该是在外层只请求一次锁:

synchronized(lock){
    for(int i=0;i

并行模式与算法

1、单例模式

2、不变模式

3、生产者-消费者模式

4、Future模式

Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。(JDK应用:Callable接口)

5、并行流水线

6、并行搜索

7、并行排序

8、并行算法:矩阵乘法


线程池相关

线程池核心参数

参数 含义
corePoolSize 线程池中的核心线程数
maximumPoolSize 线程池中的最大线程数量
keepAliveTime 多余的空闲线程的存活时间
unit keepAliveTime单位
workQueue 任务队列,被提交但是尚未被执行的任务
threadFactory 线程工厂
handler 拒绝策略

线程池的拒绝策略

策略 含义
AbortPolicy 直接抛出异常,阻止系统正常工作
CallerRunsPolicy 只要线程池未关闭,直接在调用者线程中,运行当前被丢弃的任务(性能急剧下降)
DiscardOledestPolicy 丢弃最老的一个请求
DiscardPolicy 默默的丢弃无法处理的任务


定义:守护线程是一种特殊的线程,它是系统的守护者,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程就可以理解为守护线程。


接口Callable与Runnable区别

1)Callable接口的call()方法可以有返回值,而Runnable接口的run()方法没有返回值。

2)Callable接口的call()方法可以声明抛出异常,而Runnable接口的run()方法不可以声明抛出异常。


方法excute()与submit()的区别

1) 方法excute()没有返回值,而submit()方法可以有返回值。

2)方法excute()在默认的情况下异常直接抛出,不能捕获,但可以通过自定义Thread-Factory的方式进行捕获,而submit()方法在默认情况下,可以有catch Execution-Exception捕获异常。

你可能感兴趣的:(后台Java方向学习之路)