i=0;两个线程分别对i进行++100次,值是多少?(题目)

本文探讨了Java中i++操作的非原子性,导致在多线程环境下可能出现的并发问题。当两个线程分别对变量i进行++操作100次时,结果可能在2到200之间,取决于线程调度。同时,文章对比了memcached和redis的并发处理方式,前者使用多线程加锁,后者依赖单线程和多路IO复用实现更高的效率。此外,解释了原子操作的概念,并指出Redis的单命令原子性得益于其单线程模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先第一问是:java中的i++是否是原子操作?

答案:不是。

然后再看到这题:i=0;两个线程分别对i进行++100次,值是多少?

答案:[2-200].  在这个范围内都有可能。

解析

一:200这个值是正常情况下,线程一先执行加到了100,然后线程二加到200.——200.

二:当线程一先加到99,然后被线程二打断,线程二又开始从它的0开始加1,后面又被线程一打断,把线程二的i=1取到,然后又被线程二打断,加到100,又被线程一打断,因为此时线程一为1,前面加到了99,所以只需要再加1就结束,所以最终是2.——2.

最终结果为:【2-200】

补充知识点:

首先java是多线程的。

memcached和redis底层分别如下:

多线程+锁(memcached vs   单线程+多路IO复用(Redis)效率更高

单线程是指黄牛只能一次给1,2,3中的其中一个人买。

多路IO复用是指:在黄牛只能给其中一个人买的时候,其他人1,2,3做其他事情而不需要等待。

 

原子性:

所谓原子操作是指不会被线程调度机制打断的操作

这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。

(1)在单线程中, 能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于           指令之间。

2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。

Redis单命令的原子性主要得益于Redis的单线程。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值