代码内容:
100个人使用50000的下载资源! 如果打印少于50000就是出现了并发问题!
newCachedThreadPool()根据用户的数量自动的创建线程的数量 ,没有访问就没有创建
Semaphore起到了有序排队的作用!
count++操作具有原子性问题! 打印出来的值 会小于50000!不能保证原子性所以要加锁!synchronized
在满足加锁的情况下****没有Thread.sleep()睡眠!有时候会出现打印小于50000!因为main线程跑得太快!
count++出现原子性的问题!!!
因为cpu分配资源的时候! 比如给1号分配了冰淇淋…1号开始吃一个 他就记住++ !!然而时间过期了你还没用吃完呢!!!!cpu就关闭了 不给你分配冰淇淋了了! 给另外二个个人分配了!!然后 1号就少吃了啊!!! 当然 cpu太可恶了 !!其他二个人也会少吃!!
cpu调度打破了 原子性!!!
以此类推,然后就各个线程少++一次!!!
所以保证不了原子性!!!
所以永远不会出现比50000大的数据,只会永远比50000少!!!多了你叫我!我给他吃了!!
加锁以后呢
!!!就是我来了!!!我就是锁(我就是相当于cpu的boss)
就是我来帮你了!!我必须让他给一号吃够他应该吃的冰淇淋!!!然后再给别人分配!!
源码
private static int user=100; //100个使用
private static int downTotal =50000; //50000个资源!! 如果输出少50000就是出现并发问题
private static int count=0;
public static void main(String[] args) throws InterruptedException {
//newCachedThreadPool()根据用户的数量自动的创建线程的数量 ,没有访问就没有创建
ExecutorService ex=Executors.newCachedThreadPool();
//排队 让100个人有序的排队
Semaphore se=new Semaphore(user);
for (int i = 0; i < downTotal; i++) {
ex.execute(new Runnable() {//匿名内部类
@Override
public void run() {
try {
se.acquire();
add();
se.release();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
Thread.sleep(100L);
System.out.println("下载的总数量"+count);
ex.shutdown();
}
//++操作有原子性的问题
public synchronized static void add() {
count++; //每次下载的++操作
}
下载的总数量50000