java面试,中高级部分

1、为什么说Redis是单线程的以及Redis为什么这么快。
Redis为什么这么快:
Redis不使用表,是基于Key-Value字典方式存储的 数据库,由C语言编写。他的数据库不会预定义或者强制去要求用户对Redis存储的不同数据进行关联。
数据库的工作模式按存储方式可分为:硬盘数据库和内存数据库。Redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度极快。
关键点,基于Key-Value,C语言编写,不受I/O 速度的限制
为什么Redis是单线程的:
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!)
关键点,CPU不是Redis的瓶颈
参考:https://blog.csdn.net/chenyao1994/article/details/79491337

2、java中volatile和synchronized有什么区别
1)volatile是变量修饰符,而synchronized则作用于一段代码或方法
2)volatile只是在线程内存和“主”内存间同步某个变量的值;而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。

volatile所修饰的变量不保留拷贝,直接访问主内存中的。也就是保证多个线程访问同一个内存。
在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保存要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。 一个变量声明为volatile,就意味着这个变量是不能保存副本的,子线程的memory中不保留该变量的副本,如需访问,需要每次到 main memory中获取。这样就能保证读到的不是脏数据。

synchronized用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。也就是,如果有多个线程来访问这个方法或者代码块的时候,第一个进入前就会把代码块加锁,其他线程被堵塞等待锁被释放。这样就能达到方法块被同步执行。

猜你喜欢

转载自blog.csdn.net/zhaoxichen_10/article/details/84837767