62,614
社区成员
发帖
与我相关
我的任务
分享
package com.thread.account;
import java.util.Arrays;
public class SyncAccount {
public static final double SUM_NUM = 10000;
public static final int ACCOUNT_NUM = 10;
public static final double ACCOUNT_ININ = SUM_NUM / ACCOUNT_NUM;
private double[] account;
private Object lock;
//private final Object lock = new Object();// 采用this替代
public SyncAccount(double initAmount,Object lock) {
this.lock=lock;
account = new double[ACCOUNT_NUM];
for (int i = 0; i < ACCOUNT_NUM; i++) {
account[i] = initAmount;
}
}
public boolean checkFrom(int from, double transMoney) {
//synchronized (this) {
synchronized (lock) {
return account[from] >= transMoney;
}
}
public void print(String prompt) {
//synchronized (this) {
synchronized (lock) {
System.out
.println(prompt + "Arrays={" + Arrays.toString(account) + "}");
}
}
public boolean checkSum() {
double sum = 0;
//synchronized (this) {
synchronized (lock) {
for (int i = 0; i < ACCOUNT_NUM; i++) {
sum = account[i] + sum;
}
}
return sum == SUM_NUM;
}
public int SyncTransform(int from, int to, double transMoney)
throws InterruptedException {
int result = 0;
//synchronized (this) {
synchronized (lock) {
String threadName = "Thread=" + Thread.currentThread().getName()
+ ",";
System.out.println(threadName + "lock=" + lock.hashCode());
System.out.println(threadName + "AccountFrom=" + from);
System.out.println(threadName + "AccountTo=" + to);
System.out.println(threadName + "Account[From]=" + account[from]);
System.out.println(threadName + "transMoney=" + transMoney);
print(threadName + "before trans:");
while (account[from] < transMoney) {// if的惯用法
System.out.println("in wait()");
wait();
}
account[from] = account[from] - transMoney;
account[to] = account[to] + transMoney;
System.out.println(threadName + "check sum=" + checkSum());
System.out.println(threadName + "notify all!");
print(threadName + "after trans:");
notifyAll();
return result;
}
}
}
package com.thread.account;
public class SyncAccoutManager implements Runnable {
private SyncAccount acc;
private int transFrom;
public SyncAccoutManager(SyncAccount acc,int transFrom) {
this.acc = acc;
this.transFrom=transFrom;
}
public SyncAccoutManager(SyncAccount acc) {
this.acc = acc;
this.transFrom=0;
}
// 客户端启动多线程,系统自动调用类的run方法
public void run() {
try {
while (true) {
double transMoney = SyncAccount.ACCOUNT_ININ * Math.random();
int transTo=(int)(SyncAccount.ACCOUNT_NUM *Math.random());
acc.SyncTransform(transFrom,transTo,transMoney);
Thread.sleep((long)(100*Math.random()));
}
} catch (InterruptedException e) {
System.out.println("error-------");
e.printStackTrace();
}
}
}
package com.thread.account;
public class MutiThreadClient {
public static void main(String[] args) {
double initAmount=SyncAccount.ACCOUNT_ININ;
Object lock=new int[0];
SyncAccount acc=new SyncAccount(initAmount,lock);
for (int i = 0; i < SyncAccount.ACCOUNT_NUM; i++) {
SyncAccoutManager syncAcc=new SyncAccoutManager(acc,i);
Thread t= new Thread(syncAcc);
t.start();
}
}
}