Java并发4

Posted TooLateToLearn!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发4相关的知识,希望对你有一定的参考价值。

P706)必须用一个检查感兴趣的while循环包围wait()。其本质就是要检查所感兴趣的特定条件,并在条件不满足的情况下返回到wait()中。

 

P707)notify()与notifyAll()

使用notify()时,在众多等待同一个锁的任务中只有一个会被唤醒,因此如果你希望使用notify(),就必须保证被唤醒的是恰当的任务。另外,为了使用notify(),所有任务必须等待相同的条件,因此如果你有多个任务在等待不同的条件,那么你就不知道是否会唤醒了恰当的任务。如果使用notify(),当条件发生变化时,必须只有一个任务能够从中受益。最后,这些限制对所有可能存在的子类都必须总是起作用的。如果这些规则中有任何一条不满足,那么你就必须使用notifyAll()而不是notify()。

 

notifyAll()将唤醒“所有正在等待的任务”。这是否意味着程序中任何地方,任何处于wait()状态中的任务都将被任何对notifyAll()的调用唤醒呢?事实上,当notifyAll()因某个特定锁而被调用时,只有等待这个锁的任务才会被唤醒。

 

P707)Timer

1         Timer timer = new Timer();
2         timer.scheduleAtFixedRate(new TimerTask() {
3             @Override
4             public void run() {
5                 //...
6             }
7         }, 400, 400);
8         timer.cancel();

 


P711)使用显式的Lock和Condition对象

使用互斥并允许任务挂起的基本类是Condition,你可以通过在Condition上调用await()来挂起一个任务。当外部条件发生变化,意味着某个任务应该继续执行时,你可以通过调用signal()来通知这个任务,从而唤醒一个任务,或者调用signalAll()来唤醒所有在这个Condition上被其自身挂起的任务(与使用notifyAll()相比,signalAll()是更安全的方式)。

 

P713)生产者-消费者与队列

LinkedBlockingQueue——无界队列

ArrayBlockingQueue——确定的、固定的尺寸

SynchronousQueue——尺寸固定为1

 


以上是关于Java并发4的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程实战 04死锁了怎么办?

Java并发编程实战 04死锁了怎么办?

Java编程思想之二十 并发

java并发线程锁技术的使用

如何从设置中获取数据并发送到此片段

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题