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