count出现原子性问题?怎么办冰淇淋方法讲解!!

代码内容:
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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是汤圆丫

怎么 给1分?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值