
java 线程同步!银行取钱问题!
packagecom.lovo;importjava.util.Scanner;publicclassTsynchronizedimplementsRunnable{Mo...
package com.lovo;
import java.util.Scanner;
public class Tsynchronized implements Runnable{
Money mo = new Money();
public static void main(String[] args) {
Tsynchronized ts = new Tsynchronized();
Thread th = new Thread(ts);
Thread th1 = new Thread(ts);
th.start();
th1.start();
}
public void run(){
mo.get();
}
}
class Money{
public void get (){
synchronized (this) {
int i = 5000;
int sum = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入取款金额");
int a = sc.nextInt();
sum = i-a;
System.out.println("余额为"+ sum);
}
}
}
两个线程访问一个资源,代码在上面!我运行时 money不能更新! 展开
import java.util.Scanner;
public class Tsynchronized implements Runnable{
Money mo = new Money();
public static void main(String[] args) {
Tsynchronized ts = new Tsynchronized();
Thread th = new Thread(ts);
Thread th1 = new Thread(ts);
th.start();
th1.start();
}
public void run(){
mo.get();
}
}
class Money{
public void get (){
synchronized (this) {
int i = 5000;
int sum = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入取款金额");
int a = sc.nextInt();
sum = i-a;
System.out.println("余额为"+ sum);
}
}
}
两个线程访问一个资源,代码在上面!我运行时 money不能更新! 展开
展开全部
int i = 5000;
int sum = 0;
你把钱数 i 放在方法里这是一个局部变量
每次调用 都初始化下
方法结束 就没有了
建议你把i放到类的属性里。
这样写
class Money{
volatile int i = 5000;
public void get (){
synchronized (this) {
int sum = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入取款金额");
int a = sc.nextInt();
sum = i-a;
System.out.println("余额为"+ sum);
}
}
}
希望我说的清楚
int sum = 0;
你把钱数 i 放在方法里这是一个局部变量
每次调用 都初始化下
方法结束 就没有了
建议你把i放到类的属性里。
这样写
class Money{
volatile int i = 5000;
public void get (){
synchronized (this) {
int sum = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入取款金额");
int a = sc.nextInt();
sum = i-a;
System.out.println("余额为"+ sum);
}
}
}
希望我说的清楚
展开全部
static Money mo = new Money();
将临界区的东西设置位静态,此为方法一;
synchronized (mo) {}
将锁变为锁住mo对象.此为方法2
另:你那个synchronized (this)本身是无效的啊...
二〇一七年八月二十八日 21:28:24
将临界区的东西设置位静态,此为方法一;
synchronized (mo) {}
将锁变为锁住mo对象.此为方法2
另:你那个synchronized (this)本身是无效的啊...
二〇一七年八月二十八日 21:28:24
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把Money稍作更改即可:
class Money{
int sum = 5000;
public void get (){
synchronized (this) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入取款金额");
int a = sc.nextInt();
sum -= a;
System.out.println("余额为"+ sum);
}
}
你原先把余额设在方法内部,每次运行这个方法,钱数都会初始化为5000,这是造成以上结果的原因。把钱数和余额合并为一个变量,并放在方法外,作为类变量,可以解决这个问题。
class Money{
int sum = 5000;
public void get (){
synchronized (this) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入取款金额");
int a = sc.nextInt();
sum -= a;
System.out.println("余额为"+ sum);
}
}
你原先把余额设在方法内部,每次运行这个方法,钱数都会初始化为5000,这是造成以上结果的原因。把钱数和余额合并为一个变量,并放在方法外,作为类变量,可以解决这个问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该把int i = 5000;
作为Money的属性,在class Money中怎么属性:int balance=5000;
对于线程设计上是正确的
作为Money的属性,在class Money中怎么属性:int balance=5000;
对于线程设计上是正确的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int i 是局部变量导致的问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询