单线程模拟多线程(单线程怎么处理多任务的请求)
导语:多线程-单机模式如何保证数据的正确性(一)?
提到多线程,大多数朋友第一反应就是Thread,说起线程的数据准确性,大家都会想到一个关键字synchronized,这篇文章给大家分享下其他的操作[灵光一闪]
java1.5开始推出了java.util.concurrent.atomic包,这个包下又有什么呢?下面为大家介绍。
1、AtomicInteger:相信大多数朋友在看到Integer的时候,已经明白了大半,对的,它就是用来操作int类型的数据的。既然int类型有这种原子操作,那么java中基本数据类型还有哪些呢?AtomicLong,AtomicBoolean这些都是有的啦。
AtomicInteger常用API
2、既然基本类型都有了,那数组肯定是也有的了,AtomicIntegerArray和AtomicLongArray就是数组类型了。
AtomicIntegerArray数组增加数据
atomic是怎么实现操作原子操作不受多线程干扰的呢?底层用的是synchronized吗?下边是AtomicInteger源码中是怎么实现数据操作的。
AtomicInteger操作数据
??没有synchronized,只有一个unsafe,unsafe是个什么操作?
unsafe类,java讲究变量名见名知意,完了,他是不安全的,但他是怎么实现多线程下数据操作互不影响的呢?先说unsafe,这个类使java拥有了C语言一样,拥有了操作内存空间的能力。有句话说得好,能力越大,责任越大。拥有操作内容空间能力后,C语言中的指针问题也接踵而至。由于CPU架构的原子指令不一样,那么它肯定是不安全的。
继续说atomic怎么保证了数据的准确性,atomic内部并没有使用synchronized,而是使用了更为高效的方式,使用了CAS,Volatile,native将所有工作交给了硬件处理,到了硬件层面,那肯定能保证同一时刻只能有一个线程去操作内存啦!那样就可以保证数据的准确性啦!这也是在多线程的情况下,在硬件层面对变量进行无锁操作了。
本文内容由小萱整理编辑!