* 线程同步 :使用同步方法,实现线程同步
* 同步synchronized方法的对象监视锁为this,当前对象
* 多个线程使用同一把锁,如果线程安全必需确保:多个线程使用的是同一个this对象(Runnable适用于共享同一对象[如:this],如果Thread继承就会有问题[推荐使用Runnable])
* 所有访问此对象方法的线程都在方法外等待,都会判断同步锁,降低效率,但确保线程安全问题
* java的每个对象都有一个内置锁,当用synchronized关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,线程需要获得内置锁,否则就处于阻塞状态
* synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类
此例子中使用synchronized关键字:
private synchronized void makeWithdraw(int amount){...}
BankAccount.java
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
SyncMethod.java
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
TreadSyncTest.java
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<code>正常运行结果</code><code>1</code><code>:</code>
<code>罗密欧 准备取款!</code>
<code>罗密欧 完成</code><code>100</code><code>取款!余额为</code><code>400</code>
<code>罗密欧 完成</code><code>100</code><code>取款!余额为</code><code>300</code>
<code>罗密欧 完成</code><code>100</code><code>取款!余额为</code><code>200</code>
<code>罗密欧 完成</code><code>100</code><code>取款!余额为</code><code>100</code>
<code>罗密欧 完成</code><code>100</code><code>取款!余额为</code><code>0</code>
<code>余额不足以支付朱丽叶</code><code>100</code> <code>的取款,余额为</code><code>0</code>
<code>余额不足以支付朱丽叶</code><code>100</code> <code>的取款,余额为</code><code>0</code><code>.</code>
<code>正常运行结果</code><code>2</code><code>:</code>
<code>朱丽叶 准备取款!</code>
<code>朱丽叶 完成</code><code>100</code><code>取款!余额为</code><code>0</code>
<code>余额不足以支付罗密欧</code><code>100</code> <code>的取款,余额为</code><code>0</code>
<code>正常运行结果</code><code>3</code><code>:</code>
<code>朱丽叶 完成</code><code>100</code><code>取款!余额为</code><code>100</code>
如果不用synchronized关键字的结果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
<a></a>
<a>本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/7726072.html,如需转载请自行联系原作者</a>