读书人

java中线程lock有关问题

发布时间: 2012-08-22 09:50:35 作者: rapoo

java中线程lock问题?
最近在学java线程,看的书的《core java》,就仿照里面写了个例子。
定义了一个接口:
public interface Bank {

//转账方法
public void transfer(int from,int to,double amount) throws InterruptedException;
//总钱数
public double getTotalBalance();
}

定义了一个实现类:
public class LockBank implements Bank{


private Lock lock;
private Condition sufficientFunds;
......//还有一些变量比如:银行账户等等

//转账方法
public void transfer(int from,int to,double amount) throws InterruptedException {

lock.lock();
try {
while (this.accounts[from] < amount) {
sufficientFunds.await();
}
this.accounts[from] -= amount;
System.out.println("从账户" + from + "转向账户" + to + ":" + amount);
this.accounts[to] += amount;
System.out.println("总共:" + this.getTotalBalance());
sufficientFunds.signalAll();
} finally{
lock.unlock();
}

}

//总钱数方法
public double getTotalBalance() {
lock.lock();
try {
double sum = 0;
for (int i = 0; i < this.accountNum; i++) {
sum += this.accounts[i];
}
return sum;
} finally{
lock.unlock();
}
}
}

//定义一个线程类其中的run方法如下:
//线程RUN方法
public void run() {
// TODO Auto-generated method stub

for (int i = 0; i <10; i++) {
int to=(int)(this.bank.getAccountNum()*Math.random());
double amount=this.maxAmount*Math.random();
try {
bank.transfer(this.from, to, amount);
//Thread.sleep((int)(this.delay*Math.random()));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


//Test入口
public static void main(String[] args) {
//SynchronizedBank bank = new SynchronizedBank(ACCOUNTNUM,INITIALBALANCE);
LockBank bank = new LockBank(ACCOUNTNUM,INITIALBALANCE);
for (int i = 0; i < ACCOUNTNUM; i++) {
TransferRunnable transferRunnable = new TransferRunnable(bank,i,INITIALBALANCE);
Thread thread = new Thread(transferRunnable);
thread.start();
}
}


结果报:Exception in thread "Thread-3" java.lang.NullPointerException
at com.zju.bank.LockBank.transfer(LockBank.java:48)
at com.zju.bank.TransferRunnable.run(TransferRunnable.java:68)
at java.lang.Thread.run(Thread.java:619)

lock我在LockBank中定义了 怎么回报为空的错误那。

[解决办法]
那是lock没初始化?
[解决办法]
引入包:
import java.util.concurrent.locks.*;

再把lock初始化:
lock=new ReentrantLock();
试试看。
[解决办法]
你的lock没有初始化啊肯定报空指针了

读书人网 >J2SE开发

热点推荐