十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
2. 原子性今天这篇文章要详细的说说,什么叫原子性,以及如果不是原子性的话,怎么能保证原子性。
创新互联建站网站建设公司,提供网站建设、成都网站制作,网页设计,建网站,PHP网站建设等专业做网站服务;可快速的进行网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,是专业的做网站团队,希望更多企业前来合作!
2.1 实例讲述
- 先说下并发编程的三大特性:
可见性
,有序性
,原子性
。 无论是在什么语言,原子性都是非常重要的,既然是这么晦涩的概念,那什么是原子性呢???- 先来讲述下概念:
一组动作,要么都成功,要么都失败,其目的是为了保证数据的一致性
。 这个怎么理解呢??? 比如:银行要将用户A
的钱转给用户B
. 如果A的钱扣除成功了,但是用户B的钱转账失败了,会怎么办呢,是不是数据跟我们预想的就不一致了. 如果还是不能理解的话,可以想想Java开发时的Mysql事务
,其实也是一个道理。
private static int count = 0;
private static Object o = new Object();
public static void test01() throws InterruptedException {int MAX_COUNT = 100;
Thread[] threads = new Thread[MAX_COUNT];
CountDownLatch countDownLatch = new CountDownLatch(MAX_COUNT);
for (int i = 0; i< MAX_COUNT; i++) {threads[i] = new Thread(() ->{// synchronized (o) {for (int j = 0; j< 100; j++) {count ++;
}
countDownLatch.countDown();
// }
});
}
for (Thread thread : threads) {thread.start();
}
countDownLatch.await();
System.out.println(count);
}
大家可以看看上面的实例,结果是不是每次都是10000
. 其实结果不是的,为什么会出现这种情况呢???
其实是并发线程导致的,大家可以看看上述计数的位置n ++
. 千万不要以Java的角度来看代码,因为Java的代码计算机不识别的。 看如下图:
简简单单的一句话i ++
被翻译为汇编语言后,就这么多句话。而运算语句i ++
. 可以简简单单分为三句话取值 =>运算 =>设置值
。
既然是分为多行语句,所以运行到任何一句语句中都可能被别的线程截断的。
换言之,整个i ++
是不能作为一个整体而运行的。这就是不能保证所谓的原子性。
那我们最终的目的就很简单了,就是保证执行过程的原子性,如何保证原子性呢??? 对了,上锁
大家还是看不懂上述的实例的话,给大家看下加锁以及不加锁的编译字节码
public class T01_Thread_Test01 {static int i = 0;
public static void main(String[] args) {i ++;
}
}
public class T01_Thread_Test01 {static int i = 0;
public static void main(String[] args) {synchronized (T01_Thread_Test01.class) {i ++;
}
}
}
2.2 锁的本质其实通过上述的实例就会发现,中间部分多了
monitorenter
。其实就是用来加锁的。加锁的目的就是为了多线程的序列化
这里先揭晓答案:锁的本质是:
并发编程的序列化
。 那什么叫并发编程的。其实大家可以理解为100+人同时上厕所,这样大家都很快能解决完,但是估计会很挤,而且从道德上而言就不允许这样。
3. 乐观锁 以及悲观锁那我们怎么办呢??? 就是通过维持秩序来一个一个上厕所。这样其实也是可以都上厕所的,但是就是整个过程会变慢了。
其实这就是锁的本质。
3.1 悲观锁
多线程访问数据 ==>竞争条件 ==>导致数据不一致, 怎么办呢??? ==>线程同步(将线程的执行顺序安排好) ==>加锁
3.2 乐观锁
- 悲观的认为:一个操作的执行一定会被别的线程打断的,所以一般我们的上锁 都是悲观锁。
一言不合就上锁
- 直接上锁,并发线程对于同一把锁 保持同步
3.3 JVM中两种锁
- 乐观的认为:某一个操作是不会被别的线程打断的。(
乐观锁 又称 是自旋锁 以及无锁
)- 既然是无锁是怎么保证执行的顺序的呢???
添加version
+ 每次计算后对比version + 如果version不一致的话,重新进行计算
今天的目的是:更多的以具体实例来详解说明了
原子性
。 同时也是普及了乐观锁
以及悲观锁
的概念。如果大家觉得有什么不足的地方,欢迎评论区及时留言交流啊
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧