关于java多线程任务执行时共享资源加锁的方式思考
1.加锁方式:
1-1.使用synchronized关键字进行方法或代码块的加锁方式
1-2.使用ReentrantLock类提供的lock()方法的方式
2.代码实现(传统的银行取款存款问题):
2-1.Account.java类:账户类
package com.java.thread; import java.util.concurrent.locks.ReentrantLock;
/**
* 账户类
* @author steven
*
*/
public class Account { public double money = 6000;
public ReentrantLock lock = new ReentrantLock();
public Account(double money){
this.money = money;
}
public void drawmoney(double money,String name){
synchronized (this) {
this.money -= money;
System.out.println(name+"取款后剩余钱数:"+this.money);
}
} public void drawmoney1(double money,String name){
lock.lock();
try {
this.money -= money;
System.out.println(name+"取款后剩余钱数:"+this.money);
}catch (Exception e) {
// TODO: handle exception
}finally{
lock.unlock();
}
} public synchronized void cunmony(double money,String name){
this.money += money;
System.out.println(name+"存款后剩余钱数:"+this.money);
} }
2-2.User.java类:线程实现类
package com.java.thread; /**
* 继承线程类,重写run方法
* @author steven
*
*/
public class User extends Thread{ private String username;
private Account account;
public User(String username,Account account){
this.username = username;
this.account = account;
}
public void run(){
if (username.contains("0")||username.contains("1")||username.contains("2"))
this.account.cunmony(1000,username);
else if(username.contains("3"))
this.account.drawmoney(500, username);
else
this.account.drawmoney1(100, username);
}
public static void main(String[] args) {
Account account = new Account(10000);
User user = null;
for (int i = 0; i < 5; i++) {
user = new User("user"+i, account);
user.setPriority(i+1);
user.start();
}
}
}
3.误区总结:
账户在这一问题中就算是多线程问题中的共享资源,在线程实现类中,我们需要使用构造函数的方式将该资源定义到该类的构造函数里,在具体多线程操作时创建唯一的资源,并将其放入新建线程的构造函数中,这样就能实现模拟多个线程操作同一资源的效果。
关于java多线程任务执行时共享资源加锁的方式思考的更多相关文章
- 9、Java并发性和多线程-线程安全与共享资源
以下内容转自http://ifeve.com/thread-safety/: 允许被多个线程同时执行的代码称作线程安全的代码.线程安全的代码不包含竞态条件.当多个线程同时更新共享资源时会引发竞态条件. ...
- java内存结构(执行时数据区域)
java虚拟机规范规定的java虚拟机内存事实上就是java虚拟机执行时数据区,其架构例如以下: 当中方法区和堆是由全部线程共享的数据区. Java虚拟机栈.本地方法栈和程序计数器是线程隔离的数据区. ...
- Java基础:执行时异常和非执行时异常
1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为全部异常的超类. Java中的异常分为两大类:错误Error和异常Exception.Jav ...
- C++多线程环境下注意共享资源的释放顺序
比如我现在写一个多线程下载程序,包含DownloadTask.HttpDownload两个类. class DownloadTask { //省略n行代码 public: int m_threads; ...
- java多线程并发执行demo,主线程阻塞
其中有四个知识点我单独罗列了出来,属于多线程编程中需要知道的知识: 知识点1:X,T为泛型,为什么要用泛型,泛型和Object的区别请看:https://www.cnblogs.com/xiaoxio ...
- CastleActiveRecord在多线程 事务提交时数据库资源竞争导致更新失败的测试结果记录
CastleActiveRecord 经过测试,隔离级别: // 摘要: , , , , , , , ...
- java多线程异步执行
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.ut ...
- JAVA多线程---好的博客资源收集
个人笔记,备忘 1.http://blog.csdn.net/column/details/concurrency.html 兰亭风雨的专栏 2.http://lavasoft.blog.51c ...
- java多线程总结:线程的两种创建方式及优劣比较
1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...
随机推荐
- Contiki Etimer 模块
一.Etimer概述 Etimer提供产生时间事件(timed event)的机制,当设定好的timer到期时,将会给设定etimer的process发送一个PROCESS_EVENT_TIMER 事 ...
- #基础概念#之tensor
中译名:张量 定义: from wiki: In mathematics, tensors are geometric objects that describe linear relations b ...
- jQuery圆形统计图(百分比)转 作者:月光光
今天我给大家介绍一款圆形统计图circliful,它基于HTML5的画布和jQuery,无需使用图像轻松实现圆形统计图,而且有很多属性设置,使用起来非常方便. 如何使用circliful 将jquer ...
- Loading 遮蔽层 简单实现。
<!--背景div--><div id="bg" class="bg" style="display:none;text-align ...
- ACM学习历程—ZOJ3471 Most Powerful(dp && 状态压缩 && 记忆化搜索 && 位运算)
Description Recently, researchers on Mars have discovered N powerful atoms. All of them are differen ...
- java定时器,留着用
说明:该定时器作用是 设定定时器首次执行的时间firstTime和执行间隔period,如firstTime=2015-3-25 9:00:00,period=24小时,若程序启动时,已经超过firs ...
- vijos:P1190繁忙的都市
描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路 ...
- 数据字典生成工具(生成Excel, Word,PDF,html)
转自:http://www.cnblogs.com/yanweidie/p/3838765.html 数据字典生成工具之旅系列文章导航 数据字典生成工具之旅系列文章导航 宣传语 数据字典生成工具.数据 ...
- Oracle数据去重
一.完全重复数据去重方法 具体思路是,首先创建一个临时表,然后将DISTINCT之后的表数据插入到这个临时表中;然后清空原表数据;再讲临时表中的数据插入到原表中;最后删除临时表. 对于表中完全重 ...
- K-S Test
K-S test, test for the equality of continuous, one-dimensional probability distribution that can be ...