这一章节我们接着上一章节的问题,给出一个解决方式:对象锁。

1.什么是对象锁?

对象锁是指Java为临界区synchronized(Object)语句指定的对象进行加锁,对象锁是独占排他锁。

2.什么是临界区?

临界区是指程序中的一个代码段,在这段代码中,单独并发的线程对同一个对象进行訪问。在Java中。用keyword“synchronized”标识一个临界区。

3.经常使用的对象锁:synchronized和ReentrantLock

我们以下给出两个代码样例(以下两个样例都是依据之前的银行的代码来改动的。主要改动Bank的代码,其它的不变):

代码帖子连接:http://blog.csdn.net/raylee2007/article/details/50496784

改动的代码:

使用synchronized

package com.ray.ch17;

public class Bank {
private final double[] accounts; public double[] getAccounts() {
return accounts;
} public Bank(int n, double initBalance) {
accounts = new double[n];
for (int i = 0; i < accounts.length; i++) {
accounts[i] = initBalance;
}
} public double getTotal() {
double total = 0;
for (int i = 0; i < accounts.length; i++) {
total += accounts[i];
}
return total;
} public synchronized void transfer(int fromAccount, int toAccount,
double money) {
if (accounts[fromAccount] < money) {
return;
}
accounts[fromAccount] -= money;
System.out.printf("从" + fromAccount + "账户转出%10.2f元,", money);
accounts[toAccount] += money;
System.out.printf("从" + toAccount + "账户转入%10.2f元,", money);
System.out.printf("总数:%10.2f元", getTotal());
System.out.println();
} public int size() {
return accounts.length;
}
}

使用ReentrantLock:

package com.ray.ch17;

import java.util.concurrent.locks.ReentrantLock;

public class Bank {
private final double[] accounts; private ReentrantLock reentrantLock = new ReentrantLock(); public double[] getAccounts() {
return accounts;
} public Bank(int n, double initBalance) {
accounts = new double[n];
for (int i = 0; i < accounts.length; i++) {
accounts[i] = initBalance;
}
} public double getTotal() {
double total = 0;
for (int i = 0; i < accounts.length; i++) {
total += accounts[i];
}
return total;
} public void transfer(int fromAccount, int toAccount, double money) {
reentrantLock.lock();
try {
if (accounts[fromAccount] < money) {
return;
}
accounts[fromAccount] -= money;
System.out.printf("从" + fromAccount + "账户转出%10.2f元,", money);
accounts[toAccount] += money;
System.out.printf("从" + toAccount + "账户转入%10.2f元,", money);
System.out.printf("总数:%10.2f元", getTotal());
System.out.println();
} finally {
reentrantLock.unlock();
}
} public int size() {
return accounts.length;
}
}

通过測试代码输出:

从16账户转出   6853.31元,从80账户转入   6853.31元,总数:1000000.00元
从5账户转出    819.37元,从92账户转入    819.37元,总数:1000000.00元
从12账户转出   1278.62元,从67账户转入   1278.62元,总数:1000000.00元
从3账户转出   1353.74元,从9账户转入   1353.74元,总数:1000000.00元
从94账户转出   2316.07元,从83账户转入   2316.07元,总数:1000000.00元
从59账户转出   2563.51元,从90账户转入   2563.51元,总数:1000000.00元
从82账户转出   6276.89元,从30账户转入   6276.89元,总数:1000000.00元
从2账户转出   6175.01元,从80账户转入   6175.01元,总数:1000000.00元
从21账户转出   5030.61元,从80账户转入   5030.61元,总数:1000000.00元

......(等等)

通过输出能够看见。总数已经是不再变动,不再出现误差。

总结:这一章节主要讨论了同步的方法:对象锁,以及经常使用的两个对象锁。

这一章节就到这里。谢谢。

-----------------------------------

文件夹

最新文章

  1. 【项目记录】-液化气配送app android版
  2. nginx在linux下安装
  3. SQL Server执行计划的理解【转】
  4. 第十四篇 Integration Services:项目转换
  5. JVM 指令集
  6. HDU 1892-See you(二维BIT)
  7. java中的==和equals的区别
  8. Android view的requestLayout()
  9. Mysql的四种分区
  10. angulajs 当input使用 bootstrap的email类型时,如果是无效的email格式,则ng-model无效的情况
  11. 前端面试题整理(html)
  12. kali Rolling 安装QQ
  13. MyGod_alpha版本测试报告
  14. SpringCloud Config服务端
  15. python3.6.3安装步骤,适用linux centos系统
  16. Doracle.jdbc.J2EE13Compliant=true
  17. gvim最简化设置,去掉工具栏和菜单栏
  18. redis常用命令(二)
  19. Windows下调试hadoop
  20. shell 删除文件过期文件

热门文章

  1. Python: PS 滤镜--波浪特效
  2. shrio 登录/退出
  3. 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控--转
  4. ES6学习笔记(三)字符串的扩展
  5. 关于“ERROR 2002 (HY000): Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39; (2)”的解决。
  6. python + eclipse + django + postgresql 开发网站(一)
  7. 最近学习了一下DeepLearning,发现时NB。
  8. Nginx+tomcat+ssl免费证书配置
  9. window cmd 命令大全 (order)
  10. IIS文件上传大小修改配置说明