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

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

首先第一问是: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的单线程。

 

 

 

题目重述 本题询问的是关于 `volatile` 关键字对 `i++` 操作的作用以及其线程安全性的相关问题。 详解 在 Java 中,`volatile` 关键字可以保证变量在多线程之间的**可见性**,即当一个线程修改了 `volatile` 变量,其他线程可以立即看到该修改。然而,`volatile` **并不能保证复合操作的原子性**,例如 `i++`。 `i++` 操作包括三个步骤: 1. 读取变量 `i` 的; 2. 对该进行 1; 3. 将新写回变量 `i`。 这三个步骤不是原子操作,因此即使 `i` 被声明为 `volatile`,在多线程并发执行 `i++` 时,仍可能出现**中间状态被其他线程覆盖**的问题,从而导致结果不准确。 示例说明: 假设有两个线程同时执行 `i++`,初始0: - 线程 A 读取 `i = 0`; - 线程 B 读取 `i = 0`; - 线程 A 增 1,得到 `i = 1`; - 线程 B 增 1,也得到 `i = 1`; - 线程 A 写入 `i = 1`; - 线程 B 写入 `i = 1`。 最终结果是 `i = 1`,而预期应为 `i = 2`。 因此,**仅使用 `volatile` 无法保证 `i++` 的线程安全**。要保证原子性,应该使用: - `synchronized` 关键字; - `java.util.concurrent.atomic` 包中的原子类(如 `AtomicInteger`)。 示例代码使用 `AtomicInteger`: ```java import java.util.concurrent.atomic.AtomicInteger; public class Counter { private AtomicInteger i = new AtomicInteger(0); public void increment() { i.incrementAndGet(); } public int get() { return i.get(); } } ``` 知识点 1. **volatile 关键字**:保证变量的可见性,但不保证复合操作的原子性。 2. **原子操作**:像 `i++` 这种操作不是原子的,需要额外机制(如 `AtomicInteger`)保证线程安全。 3. **线程安全机制**:使用 `synchronized` 或 `AtomicInteger` 可以确保多线程环境下操作的安全性和正确性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值