j***a语言是单线程吗,j***a语言是单线程吗为什么

kodinid 16 0

大家好,今天小编关注到一个比较意思的话题,就是关于java语言是单线程吗的问题,于是小编就整理了4个相关介绍Java语言是单线程吗的解答,让我们一起看看吧。

  1. java什么是线程池及为什么要使用线程池?
  2. 单线程Redis性能为何如此之高?
  3. JAVA面试中常常问到的无锁CAS是什么?
  4. Java工程师是如何使用Redis的?

JAVA什么是线程池及为什么要使用线程池?

创建线程要花费昂贵的***和时间如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,J***a API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。

单线程Redis性能为何如此之高?

Redis的优势

java语言是单线程吗,java语言是单线程吗为什么-第1张图片-安济编程网
图片来源网络,侵删)

性能高不仅跟线程模型有关,它有很多原因,主要有如下3点:

性能高低都是相对的,Redis是基于内存数据库,相对的我们拿传统的基于磁盘数据进行对比,如图

其中,Redis数据库基于内存,分场景如下:

java语言是单线程吗,java语言是单线程吗为什么-第2张图片-安济编程网
(图片来源网络,侵删)

传统磁盘数据库,分场景如下:

以上可以看出:Redis是基于内存的数据库,大多数操作在内存中完成,内存的IO效率比磁盘要高的多。因此,这是Redis性能高的一个原因。

Redis是单线程的,通常如果单线程处理效率不高,都开多线程处理,但是Redis这里为什么反到效率高了呢?

java语言是单线程吗,java语言是单线程吗为什么-第3张图片-安济编程网
(图片来源网络,侵删)

Redis的“I/ O 多路 复 用”是***用的效率最高的epoll模式,单线程却实现了多客户端接入,以及高IO利用率。如下图

J***A面试中常常问到的无锁CAS是什么?

在缓存领域有一对奇葩,多线程的缓存和单线程的redis,而两者的性能是差不多的,之所以redis能凭借单线程提供强大的性能并且线程安全操作:

一是不存在多线程直接切换的***开销,

二是大部分的指令都是原子的,原子的指令拥有更高的效率,并且保证线程安全!

在j***a中的原子操作主要封装并发包下,以Atomic打头的类中,如下截图:


观察这些类发现,其中的原子操作主要依赖于UnSafe包中类似unsafe.compareAndSwapInt这样的算法,取单词首,也即是CAS操作,这也是实现无锁操作保证线程安全的基石,乐观锁因为建立在CPU的底层指令原子操作,效率比起同步锁相当高;

CAS:compare,and,swap:顾名思义,就是比较并交换,这属于一种乐观锁思想,悲观锁通常是把共享***的持有者当做互斥的,由此保证针对共享***操作的只会是持有锁的程序!

乐观锁之所以称为乐观,就是***设数据在操作之前都是没有修改过的,如果已经被修改过,则不进行操作,降低了阻塞的可能性!

CAS的思想在sql操作中常常用到,比如未付款status=1,已付款status=2,sql:update set status=2,version=version+1 where id = xx and status =1 and version=${version},即是如果是还未付款的状态则付款,如果已经付过款(status=2),则操作失败;

但是CAS也存在问题:

①,ABA问题,比如上面的sql,如果status是会从1(A)到2(B)再到1(A)的,那么就会存在线程一已经从1->2->1了,而线程二还认为整个数据都没有变过,继续修改数据;

J***a工程师如何使用Redis的?

redis的使用场景:1.Counting(计数)

2.展示最近、最热、点击率最高、活跃度最高等等条件的top list

3.用户最近访问记录也是redis list的很好应用场景

4.通过list的lpop及lpush接口进行队列写入和消费

5.Redis 的Lua的功能扩展实际给Redis带来了更多的应用场景,你可以编写若干command组合作为一个小型的非阻塞事务或者更新逻辑

6.Redis提供的主从数据同步功能,其实是对cache的一个强有力功能扩展

到此,以上就是小编对于j***a语言是单线程吗的问题就介绍到这了,希望介绍关于j***a语言是单线程吗的4点解答对大家有用。

标签: 线程 Redis 单线