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多线程任务执行时共享资源加锁的方式思考的更多相关文章

  1. 9、Java并发性和多线程-线程安全与共享资源

    以下内容转自http://ifeve.com/thread-safety/: 允许被多个线程同时执行的代码称作线程安全的代码.线程安全的代码不包含竞态条件.当多个线程同时更新共享资源时会引发竞态条件. ...

  2. java内存结构(执行时数据区域)

    java虚拟机规范规定的java虚拟机内存事实上就是java虚拟机执行时数据区,其架构例如以下: 当中方法区和堆是由全部线程共享的数据区. Java虚拟机栈.本地方法栈和程序计数器是线程隔离的数据区. ...

  3. Java基础:执行时异常和非执行时异常

    1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为全部异常的超类. Java中的异常分为两大类:错误Error和异常Exception.Jav ...

  4. C++多线程环境下注意共享资源的释放顺序

    比如我现在写一个多线程下载程序,包含DownloadTask.HttpDownload两个类. class DownloadTask { //省略n行代码 public: int m_threads; ...

  5. java多线程并发执行demo,主线程阻塞

    其中有四个知识点我单独罗列了出来,属于多线程编程中需要知道的知识: 知识点1:X,T为泛型,为什么要用泛型,泛型和Object的区别请看:https://www.cnblogs.com/xiaoxio ...

  6. CastleActiveRecord在多线程 事务提交时数据库资源竞争导致更新失败的测试结果记录

    CastleActiveRecord 经过测试,隔离级别: // 摘要: ,         ,         ,         ,         ,         ,         ,   ...

  7. java多线程异步执行

    import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.ut ...

  8. JAVA多线程---好的博客资源收集

    个人笔记,备忘 1.http://blog.csdn.net/column/details/concurrency.html    兰亭风雨的专栏 2.http://lavasoft.blog.51c ...

  9. java多线程总结:线程的两种创建方式及优劣比较

    1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...

随机推荐

  1. SDUT OJ 之 连通分量个数 (dfs)

    数据结构实验:连通分量个数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  在无向图中,如果从顶点vi到顶点vj有路径,则称vi ...

  2. haproxysocket 参数记录

    haproxy的一些指标 pxname  组名 svname  服务器名 qcur    当前队列 qmax    最大队列 scur当前会话用户 smax最大会话用户 slim会话限制 stot会话 ...

  3. 修改ubuntu14.04命令行启动

    方法1: 原来要想默认不进入xwindows,只需编辑文件”/etc/default/grub”, 把 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash” 改成GRUB ...

  4. html5--2.3新的布局元素(2)-article

    html5--2.3新的布局元素(2)-article 学习要点 了解article元素的语义和用法 完成一个简单的实例 article元素(标签) 用于定义一个独立的内容区块,比如一篇文章,一篇博客 ...

  5. python学习笔记:第六天(流程控制语句)

    Python3 条件控制 1.if 语句 <1> 一般形式 Python中if语句的一般形式如下所示: if condition_1: statement_block_1 elif con ...

  6. listen 70

    Better Sidewalks Could Bring Improved Public Health Most of our serious illnesses and deaths in the ...

  7. 0x01

    随便记录点想法什么的, 这个博客的编辑界面挺简陋的...

  8. CodeForces - 1000E :We Need More Bosses(无向图缩点+树的直径)

    Your friend is developing a computer game. He has already decided how the game world should look lik ...

  9. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  10. 【LeetCode】046. Permutations

    题目: Given a collection of distinct numbers, return all possible permutations. For example,[1,2,3] ha ...