62,614
社区成员
发帖
与我相关
我的任务
分享
public class Bank {
private AtomicInteger account = new AtomicInteger(100);
public int save(int money) {
return account.AddAndGet(money);
}
}
NewThread类的改造:
public class NewThread implements Runnable {
private Bank bank;
public NewThread(Bank bank) {
this.bank = bank;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + "账户余额为:" + bank.save(10) + " 线程名称:" + Thread.currentThread().getName());
}
}
}
其他不变,不管你有多少个并发线程,对account的操作都是保证原子操作的,打印出来的信息可能不是按金额从小到大排列的,但是多个线程都往一个控制台打印肯定会有这样的情况
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class test10 {
public static void main(String[] arg0) {
Bank bank = new Bank();
Save s = new Save(bank);
Thread thread1 = new Thread(s);
Thread thread2 = new Thread(s);
thread1.start();
thread2.start();
}
}
class Bank {
private int account = 100;
public int getAccount() {
return account;
}
public void setAccount(int account) {
this.account = account;
}
}
class Save implements Runnable {
Bank bank = null;
Lock lock = new ReentrantLock();
public Save(Bank bank) {
super();
this.bank = bank;
}
public void run() {
for (int i = 0; i < 10; i++) {
lock.lock();
//要做几步都在try代码块中完成
try {
bank.setAccount(bank.getAccount() + 10);
System.out.println(i + "账户余额为:" + bank.getAccount() + "线程名称:" + Thread.currentThread().getName());
Thread.sleep(1000);//不加入sleep太快了,另个线程基本抢不到
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//最后在finally中释放锁
lock.unlock();
}
}
}
}
运行结果:
0账户余额为:110线程名称:Thread-0
0账户余额为:120线程名称:Thread-1
1账户余额为:130线程名称:Thread-0
1账户余额为:140线程名称:Thread-1
2账户余额为:150线程名称:Thread-0
2账户余额为:160线程名称:Thread-1
3账户余额为:170线程名称:Thread-0
3账户余额为:180线程名称:Thread-1
4账户余额为:190线程名称:Thread-0
4账户余额为:200线程名称:Thread-1
5账户余额为:210线程名称:Thread-0
5账户余额为:220线程名称:Thread-1
6账户余额为:230线程名称:Thread-0
6账户余额为:240线程名称:Thread-1
7账户余额为:250线程名称:Thread-0
7账户余额为:260线程名称:Thread-1
8账户余额为:270线程名称:Thread-0
9账户余额为:280线程名称:Thread-0
8账户余额为:290线程名称:Thread-1
9账户余额为:300线程名称:Thread-1
这样不知道合不合你要求
public void run() {
for (int i = 0; i < 10; i++) {
lock1.lock();
try{
bank.save(10);
System.out.println(i + "账户余额为:"
+bank.getAccount()+" 线程名称:"+Thread.currentThread().getName());
}finally {
lock1.unlock();
}
}
}