从头认识java-17.4 具体解释同步(3)-对象锁
这一章节我们接着上一章节的问题,给出一个解决方式:对象锁。
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元
......(等等)
通过输出能够看见。总数已经是不再变动,不再出现误差。
总结:这一章节主要讨论了同步的方法:对象锁,以及经常使用的两个对象锁。
这一章节就到这里。谢谢。
-----------------------------------
从头认识java-17.4 具体解释同步(3)-对象锁的更多相关文章
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
- java的synchronized有没有同步的类锁?
转自:http://langgufu.iteye.com/blog/2152608 http://www.cnblogs.com/beiyetengqing/p/6213437.html 没有... ...
- 简单测试Java线程安全中阻塞同步与非阻塞同步性能
摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- JAVA多线程之Synchronized关键字--对象锁的特点
一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...
- [Java开发之路](9)对象序列化与反序列化
1. 对象序列化 当你创建对象时.仅仅要你须要.它会一直存在,可是程序终止时,不管何时它都不会继续存在.虽然这样做是很有意义的,可是在某些情况下.假设程序不执行时扔能存在而且保存其信息,那将对我们很实 ...
- java 线程基本概念 可见性 同步
开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...
- “全栈2019”Java第九章:解释第一个程序
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理
Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...
随机推荐
- nyoj--19--擅长排列的小明(dfs)
擅长排列的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难 ...
- 5. webservice通信调用天气预报接口实例
转自:https://blog.csdn.net/xiejuan6105/article/details/78452605 一:环境搭建 1:新建一个java project工程weatherInf ...
- POJ 3263 差分+set判重
题意: 思路: 对于每一个区间 [a,b] [a+1,b-1]肯定是比a,b低至少1的 因为题目要求最大值 所以就直接差分一下 搞之 (复杂度 O(n)) Discuss里说有重复的数据 用set判一 ...
- Android自定义控件简单实现ratingbar效果
先上图: 一开始让我自定义控件我是拒绝的,因为android很早以前就有一个控件ratingbar,但是设置样式的时候我发现把图片设置小一点就显示不全,一直找不到解办法!(可以设置系统的自带的小样式) ...
- gym 100735I
Description standard input/outputStatements You are given three numbers. Is there a way to replace v ...
- Nginx 代理以及HTTPS (二)
一.HTTPS解析 https 加密 私钥 公钥 http 的握手 是确认网络是连通的. https 的握手 是一个加密的过程 加密图 二. 使用Nginx 部署HTTPS 服务 1.证书生成命令(h ...
- javascript中 visibility和display的区别
visibility属性用来确定元素是显示还是隐藏的,这用visibility="visible|hidden"来表示(visible表示显示,hidden表示隐藏). 当visi ...
- su su- sudo区别概述
在Linux的操作中经常会用到su 命令进行用户的切换和sudo命令获取root权限,su su- sudo三个命令经常弄混,下面简单的讲解下. 一.查看su的命令帮助信息: pipci@openSU ...
- python多线程理解
在发送网络请求的过程中,单个请求的速度总是有着很大的限制,而任务往往需要以更快的速度去执行,这时多线程就是一个很好地选择.python已经给我们封装好了多线程库thread和threading. th ...
- 网络爬虫与web之间的访问授权协议——Robots
网站的管理者们通常会有这样一种心态:一方面期待百度.Google这样的搜索引擎来抓取网站的内容,另一方面又很厌恶其他来路不明的网络爬虫抓取自己的信息.正是因为这样,才有“好爬虫”.“坏爬虫”这样的说法 ...