大家好,今天小编关注到一个比较有意思的话题,就是关于java语言是单线程吗的问题,于是小编就整理了4个相关介绍Java语言是单线程吗的解答,让我们一起看看吧。
JAVA什么是线程池及为什么要使用线程池?
创建线程要花费昂贵的***和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,J***a API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。
单线程Redis性能为何如此之高?
Redis的优势
性能高不仅跟线程模型有关,它有很多原因,主要有如下3点:
性能高低都是相对的,Redis是基于内存的数据库,相对的我们拿传统的基于磁盘的数据库进行对比,如图:
其中,Redis数据库基于内存,分场景如下:
传统磁盘数据库,分场景如下:
以上可以看出:Redis是基于内存的数据库,大多数操作在内存中完成,内存的IO效率比磁盘要高的多。因此,这是Redis性能高的一个原因。
Redis是单线程的,通常如果单线程处理效率不高,都开多线程处理,但是Redis这里为什么反到效率高了呢?
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
4.通过list的lpop及lpush接口进行队列的写入和消费
5.Redis 的Lua的功能扩展实际给Redis带来了更多的应用场景,你可以编写若干command组合作为一个小型的非阻塞事务或者更新逻辑
6.Redis提供的主从数据同步功能,其实是对cache的一个强有力功能扩展
到此,以上就是小编对于j***a语言是单线程吗的问题就介绍到这了,希望介绍关于j***a语言是单线程吗的4点解答对大家有用。