Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
CS-Notes
提交
bd183c28
C
CS-Notes
项目概览
wushizhenking
/
CS-Notes
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
CS-Notes
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bd183c28
编写于
4月 09, 2018
作者:
C
CyC2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
auto commit
上级
bee393f6
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
19 addition
and
9 deletion
+19
-9
notes/Java 并发.md
notes/Java 并发.md
+19
-9
未找到文件。
notes/Java 并发.md
浏览文件 @
bd183c28
...
...
@@ -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.con
furrent 类库中提供了 Condition 类来实现线程之间的协调,可以在 Condition 上调用 await() 方法时线程等待,其它线程调用 signal() 或 signalAll() 方法唤醒挂起的线程
。
java.util.con
current 类库中提供了 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.concurrent(J.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
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录