面试常见的一些底层知识(二)

java基础

Posted by LY on October 9, 2018

欢迎大家关注我的以下主页,尤其是今日头条!!!谢谢🙏🙏🙏

csdn:雷园的csdn博客

个人博客:雷园的个人博客

简书:雷园的简书

今日头条:来自底层程序员的仰望

面试常见的一些底层知识点(二)

equals和“==”的区别

值类型(int,char,long,boolean等)都是用==判断相等性。对象引用的话,==判断引用所指的对象是否是同一个。equals是Object的成员函数,有些类会覆盖(override)这个方法,用于判断对象的等价性。例如String类,两个引用所指向的String都是”abc”,但可能出现他们实际对应的对象并不是同一个(和jvm实现方式有关),因此用==判断他们可能不相等,但用equals判断一定是相等的。

实现多线程的方式

1.实现Runnable接口实现多线程

2.继承Thread实现多线程

3.通过Callable和Future创建线程

直接调用run()方法能否启动线程

直接调用run()方法是不能启动新的线程的,虽然也会执行方法体,但是不会启动新的线程。

正确的启动新线程的方式

通过调用线程对象的start()方法启动线程,实现多线程。

new FirstThreadTest().start();

sleep()方法

让当前线程休眠指定时间(暂停执行),以此让其他线程有机会继续执行,但是此方法不会释放对象锁。如果有Synchronized同步则其他线程不能访问共享数据。

yield()方法

yield()方法和sleep()方法类似,也不会释放“锁标志”,区别在于,它没有参数,它只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行,另外yield()方法只能使同优先级或者高优先级的线程得到执行机会。

join()方法

Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。

Thread t = new MyThread(); t.start(); t.join();

保证当前线程停止执行,直到该线程所加入的线程完成为止。然而,如果它加入的线程没有存活,则当前线程不需要停止。

参考链接

怎么实现线程锁

线程锁的实现方式

什么是线程池,为什么使用线程池

基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

线程的五种状态

新建(New)、就绪(Runnable)、运行(Running)、 阻塞(Blocked)和死亡(Dead)5种状态

1.新建(new Thread) 当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。 例如:Thread t1=new Thread();

2.就绪(runnable) 线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();

3.运行(running) 线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。

4.死亡(dead) 当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。

5.堵塞(blocked) 由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。

redis是什么

redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型,类似于Java中的map)。Redis基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

为什么使用redis

1.当数据量的总大小一个机器放不下时。 2.数据索引一个机器的内存放不下时。 3.访问量(读写混合)一个实例放不下时。

使用redis有什么好处

1.易扩展 ​ 这些类型的数据存储不需要固定的模式,无需多余的操作就可以进行横向的扩展。相对于关系型数据库可以减少表和字段特别多的情况。也无型之间在架构的层面上带来了可扩展的能力 2.大数据量提高性能 3.多样灵活的数据模型 ​ 在nosql中不仅可以存储String,hash,set、Zset等数据类型,还可以保存javaBean以及多种复杂的数据类型。