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. C# nunit 单元测试

    1. 引包 nunit.framework.dll

  2. MysqL的root用户不允许远程连接,只能通过PHPMYADMIN

    解决方法:1.改表法 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 &q ...

  3. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  4. 如何设置android studio让程序运行在真机中

    1.Run——>Edit Configurations... 2.运行

  5. (转)MongoDB和Redis区别

    简介 MongoDB更类似Mysql,支持字段索引.游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务. Mysql在大数据量时效率显著下降,MongoDB更多 ...

  6. GSM —— 商业蜂窝通信系统

    用户漫游: HLR:当用户办卡时,当地运营商把用户资料(归属地信息等)输入 HLR: VLR:当用户漫游到别的城市时,漫游地的 VLR 把用户资料从 HLR 复制过来,用户便可以继续享受运营商的通信服 ...

  7. AndyQsmart ACM学习历程——ZOJ3872 Beauty of Array(递推)

    Description Edward has an array A with N integers. He defines the beauty of an array as the summatio ...

  8. FFmpeg命令:几种常见场景下的FFmpeg命令(摄像头采集推流,桌面屏幕录制推流、转流,拉流等等)

    前提: 首先你得有FFmpeg(ffmpeg官网快捷通道:http://ffmpeg.org/) 再者,推流你得有个流媒体服务,个人测试用小水管:rtmp://eguid.cc:1935/rtmp/t ...

  9. MVC之一、预备知识储备

    自动属性 隐式类型 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 (1).自动属性(Auto-Implemented Properties) C#自动属性可以避免原来这样我们手工声 ...

  10. Oracle日期范围

    一.SQL语句: select to_date(to_char(to_date('2017-10-01', 'yyyy-mm-dd') + rownum - 1, 'yyyy-mm-dd'), 'yy ...