面试官出了一道笔试题,自己感觉还不错,就记录下来了。
题目
1、有20个账户,每个账户初始10000元。
2、有10个转账线程,从20个账户中随机抽取2个进行转账,转账金额为100以内随机的正整数。
3、每个线程转账100次。
4、请打印转账结束后所有账户的金额。
解决思路
我的解决思路是用juc下的CopyOnWriteArrayList,存储每个账户,账户的金额用AtomicInteger赋值,保证原子性。再自定义个简单线程池(阻塞队列参数用的是LinkedBlockingQueue,要设置队列大小,默认值是Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM),10个转账线程转账100次,每次随机获取两个账户时,要注意随机获取的账户是否是同一个。转账完成后,打印即可。
代码演示
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 1.有20个账户,每个账户初始10000元
* 2.有10个转账线程,从20个账户中随机抽取2个进行转账,转账金额为100以内随机的正整数
* 3.每个线程转账100次
* 4.请打印转账结束后所有账户的金额
*/
class zhCache{
CopyOnWriteArrayList<AtomicIn