auto commit

This commit is contained in:
CyC2018 2018-04-09 12:17:22 +08:00
parent bee393f64d
commit bd183c28e0

View File

@ -76,11 +76,11 @@
## 无限期等待Waiting
等待其它线程显示地唤醒,否则不会被分配 CPU 时间片
等待其它线程显示地唤醒,否则不会被分配 CPU 时间片
| 进入方法 | 退出方法 |
| --- | --- |
| 没有设置 Timeout 参数的 Object.wait() 方法 | Object.notify() Object.notifyAll() |
| 没有设置 Timeout 参数的 Object.wait() 方法 | Object.notify() / Object.notifyAll() |
| 没有设置 Timeout 参数的 Thread.join() 方法 | 被调用的线程执行完毕 |
| LockSupport.park() 方法 | - |
@ -88,10 +88,14 @@
无需等待其它线程显示地唤醒,在一定时间之后会被系统自动唤醒。
调用 Thread.sleep() 方法使线程进入限期等待状态时,常常用“使一个线程睡眠”进行描述。
调用 Object.wait() 方法使线程进入限期等待或者无限期等待时,常常用“挂起一个线程”进行描述。
| 进入方法 | 退出方法 |
| --- | --- |
| Thread.sleep() 方法 | 时间结束 |
| 设置了 Timeout 参数的 Object.wait() 方法 | 时间结束 / Object.notify() Object.notifyAll() |
| 设置了 Timeout 参数的 Object.wait() 方法 | 时间结束 / Object.notify() / Object.notifyAll() |
| 设置了 Timeout 参数的 Thread.join() 方法 | 时间结束 / 被调用的线程执行完毕 |
| LockSupport.parkNanos() 方法 | - |
| LockSupport.parkUntil() 方法 | - |
@ -547,7 +551,7 @@ ReentrantLock 多了一些高级功能。
# 六、线程之间的协作
当多个线程可以一起工作去解决某个问题时,需要对它们进行协调,因为某些部分必须在其它部分之前完成
当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调
## join()
@ -611,7 +615,7 @@ B
只能用在同步方法或者同步控制块中使用,否则会在运行时抛出 IllegalMonitorStateExeception。
使用 wait() 挂起期间,线程会释放锁。这是因为,如果没有释放锁,那么其它线程就无法进入对象的同步方法或者同步控制块中,那么就无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程。
使用 wait() 挂起期间,线程会释放锁。这是因为,如果没有释放锁,那么其它线程就无法进入对象的同步方法或者同步控制块中,那么就无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程,造成死锁
```java
public class WaitNotifyExample {
@ -645,12 +649,12 @@ after
**wait() 和 sleep() 的区别**
1. wait() 是 Object 的方法,而 sleep() 是 Thread 的静态方法;
1. wait() 是 Object 的方法,而 sleep() 是 Thread 的静态方法;
2. wait() 会释放锁sleep() 不会。
## await() signal() signalAll()
java.util.confurrent 类库中提供了 Condition 类来实现线程之间的协调,可以在 Condition 上调用 await() 方法时线程等待,其它线程调用 signal() 或 signalAll() 方法唤醒挂起的线程
java.util.concurrent 类库中提供了 Condition 类来实现线程之间的协调,可以在 Condition 上调用 await() 方法使线程等待,其它线程调用 signal() 或 signalAll() 方法唤醒等待的线程。相比于 wait() 这种等待方式await() 可以指定等待的条件,因此更加灵活
使用 Lock 来获取一个 Condition 对象。
@ -690,6 +694,11 @@ public class AwaitSignalExample {
}
```
```html
before
after
```
# 七、J.U.C - AQS
java.util.concurrentJ.U.C大大提高了并发性能AQS 被认为是 J.U.C 的核心。
@ -730,7 +739,7 @@ run..run..run..run..run..run..run..run..run..run..end
用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行。
和 CountdownLatch 相似,都是通过维护计数器来实现的。但是它的计数器是递增的,每次执行 await() 方法之后,计数器会加 1直到计数器的值和设置的值相等等待的所有线程才会继续执行。和 CountdownLatch 的另一个区别是 CyclicBarrier 的计数器可以循环使用,所以它才叫做循环屏障。
和 CountdownLatch 相似,都是通过维护计数器来实现的。但是它的计数器是递增的,每次执行 await() 方法之后,计数器会加 1直到计数器的值和设置的值相等等待的所有线程才会继续执行。和 CountdownLatch 的另一个区别是CyclicBarrier 的计数器可以循环使用,所以它才叫做循环屏障。
下图应该从下往上看才正确。
@ -738,6 +747,7 @@ run..run..run..run..run..run..run..run..run..run..end
```java
public class CyclicBarrierExample {
public static void main(String[] args) throws InterruptedException {
final int totalTread = 10;
CyclicBarrier cyclicBarrier = new CyclicBarrier(totalTread);
@ -770,7 +780,7 @@ Semaphore 就是操作系统中的信号量,可以控制对互斥资源的访
<div align="center"> <img src="../pics//Semaphore.png"/> </div><br>
以下代码模拟了对某个服务的并发请求,每次只能 3 个客户端同时访问,请求总数为 10。
以下代码模拟了对某个服务的并发请求,每次只能 3 个客户端同时访问,请求总数为 10。
```java
public class SemaphoreExample {