JAVA并发编程笔记

来源:互联网 发布:2017科幻电影推荐知乎 编辑:程序博客网 时间:2024/05/22 00:09
  1. Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
  2. 闭锁用于所有线程等待一个外部事件的发生;栅栏则是所有线程相互等待,直到所有线程都到达某一点时才打开栅栏,然后线程可以继续执行。
  3. while(true) 被底层调用,运算特别快 某些操作来不及进行
  4. 使用Calable接口实现并发的时候,需要用FutureTask实现类来接收返回的值,
    FutureTask 是Futre接口的实现类
    futureTask.get()

  5. 非静态方法的锁默认是this,静态方法的锁为 对应的Class实例

  6. ThreadPoolExecutor 是线程池的实现类
    ScheduledExecutorService 子接口 负责线程的调度
    ScheduledThreadPoolExecutor 负责线程调度的线程池实现类

  7. ExecutorService pool=Executors.newFixedtThreadPool(5):
    pool.submit( Runnable);
    pool.shutdown ;

  8. interrupt方法能中断目标线程,而isInterrupted方法能返回目标线程的中断状态,静态的interrupted方法将清除当前线程的中断状态,也是清除中断状态的唯一一个方法。

  9. awaitTermination(),service.awaitTermination(10,TIMEUNIT.SECONDS),等待service中的线程执行10s,进入阻塞状态,如果线程5s就执行完了,则解除阻塞状态,执行后续代码,若10s线程还未执行完毕,则执行后续代码。(和外卖送餐的情景类似)

  10. interrupt方法能中断目标线程,而isInterrupted方法能返回目标线程的中断状态,静态的interrupted方法将清除当前线程的中断状态,也是清除中断状态的唯一一个方法。

  11. ThreadLocal可以理解为将对象的作用范围限制在一个线程上下文中,使得变量的作用域为“线程级”。

  12. 有三种方式可以降低锁的竞争程度
    1.减少锁的持有时间
    2.降低锁的请求频率
    3.使用带有协调机制的独占锁,这些机制允许更高的并发性。

  13. 可重入锁 意味着进入一个房间一直拿着钥匙,这把钥匙可以开之后的门。 不可重入锁 意味着进入一个门 就不再携带钥匙

  14. 公平锁与非公平锁的理解:
    有一个state变量,初始值为0,假设当前线程为A,每当A获取一次锁,status++. 释放一次,status–.锁会记录当前持有的线程。当A线程拥有锁的时候,status>0. B线程尝试获取锁的时候会对这个status有一个CAS(0,1)的操作,尝试几次失败后就挂起线程,进入一个等待队列。如果A线程恰好释放,–status==0, A线程会去唤醒等待队列中第一个线程,即刚刚进入等待队列的B线程,B线程被唤醒之后回去检查这个status的值,尝试CAS(0,1),而如果这时恰好C线程也尝试去争抢这把锁非公平锁实现:C直接尝试对这个status CAS(0,1)操作,并成功改变了status的值,B线程获取锁失败,再次挂起,这就是非公平锁,B在C之前尝试获取锁,而最终是C抢到了锁。公平锁:C发现有线程在等待队列,直接将自己进入等待队列并挂起,B获取锁

  15. 在wait()外嵌套while循环 可以防止虚假唤醒

  16. 只有当任务相互独立时,为线程池或工作队列设置界限才是合理的,如果任务之间存在依赖性,那么有界的线程池或队列就可能导致线程“饥饿”死锁问题,此时应使用无界线程池newCachedThreadPool

  17. 从list中遍历的每个Future对象并不一定处于完成状态,这时调用get()方法就会被阻塞住,如果系统是设计成每个线程完成后就能根据其结果继续做后面的事,这样对于处于list后面的但是先完成的线程就会增加了额外的等待时间。
    而CompletionService的实现是维护一个保存Future对象的BlockingQueue。只有当这个Future对象状态是结束的时候,才会加入到这个Queue中,take()方法其实就是Producer-Consumer中的Consumer。它会从Queue中取出Future对象,如果Queue是空的,就会阻塞在那里,直到有完成的Future对象加入到Queue中.CompletionService采取的是BlockingQueue

原创粉丝点击