java面试常见问题(一)

一、java如何开启线程?怎么保证线程安全?

答:线程与进程的区别:进程是操作系统进行资源分配的最小单元。线程是操作系统进行任务分配的最小单元,线程隶属于进程。

如何开启线程?1、继承Tread类,重写run方法。2、实现Runnable接口,实现run方法。3、实现Callable接口,实现call方法。通过FuTureTask创建一个线程,获取到线程执行的返回值。4、通过线程池来开启线程。

怎么保证线程安全?加锁:1、jvm提供的锁,也就是Synchronized关键字。2.JDK提供的各种锁Lock

二、Volatile和Synchronized有什么区别?Volatile能不能保证线程安全?DCL(Double check lock)单例为什么要加Volatile?

答:

1、Synchronized关键字,用来加锁。Volatile只是保持变量的线程可见性。通常适用于一个线程写,多个线程读的场景。

2、不能,volatile关键字只能保证线程可见性,不能保证原子性。

3、Volatile防止指令重排序。在双重检查锁中,防止高并发情况下,指令重排造成的线程安全问题。(对象创建步骤:1、分配内存空间2、对象初始化 3、建立指针对应关系)

三、Java线程锁机制是怎样的?偏向锁、轻量级锁、重量级锁有什么区别?锁机制是如何升级的?

1、java的锁就是在对象的Markword中记录一个锁状态。无锁,偏向锁,轻量级锁,重量级锁对应 不同的锁状态。

2、java的锁机制就是根据资源竞争的激烈程序不断进行锁升级的过程

情况一、new对象 -》开启偏向锁-》轻度竞争变成轻量级锁-》重度竞争变成重量级锁

情况二、new对象 -》开启偏向锁-》重度竞争或耗时过长 ,wait()等直接变成重量级锁

四、谈谈你对AQS的理解?AQS如何实现可重入锁?

 1、 AQS是一个Java线程同步的构架,是JDK中很锁工具的核心实现框架。

2、在AQS中,维护了一个信号量state和一个线程组成的双向链表队列。其中,这个线程队列,就是用来给线程排队的,而state就像是一个红绿灯,用来控制线程排队或者放行的。在不同的场景下,有不同的意义。

3、在可重入锁这个场景下,state就用来表示加锁的次数,0标识无锁,每加一次锁,state就加1,释放锁state就减1。

五、有A,B,C三个线程,如何保证三个线程同时执行?如何在并发情况下保证三个线程依次执行?如何保证三个线程有序交错进行?

 countDownLatch,CylicBarrier,Semaphore.

六、如何对一个数组快速进行排序?

1,归并排序,先拆分成一个或两个数字,然后再比较大小后合并一起

七、TCP和UDP有什么区别?TCP为什么是三次握手,而不是两次?

1、TCP(Transfer Control Protocol):是一种面向连接的、可靠的、传输层通信协议。

特点:好比是打电话:面向连接的,点对点的通信,高可靠的,效率比较低,占用的系统资源比较多

2、UDP(User Daagram Protocol)是一种无连接的,不可靠的、传输层通信协议

特点:好比是广播:不需要连接,发送方不接收方有没有准备好,直接发消息,可以进行广播发送的;传输不可靠,有可能丢失消息,效率比较高,协议就会比较简单,占用的系统资源就比较少。

TCP建立连接是三次握手,断开连接是四次挥手。

3、如果是两次握手,可能连接资源浪费的情况

八、java有哪几种IO模型?有什么区别?

BIO 同步阻塞IO。可靠性,吞吐量低,适用于连接比较少且比较固定的场景,JDK1.4之前唯一的选择,编程模型最简单

NIO 同步非阻塞IO 可靠性比较好,吞吐量也比较高,适用于连接比较多并且连接比较短(轻操作),例如聊天室,JDK1.4开始支持,编程模型最复杂。

AIO 异步非阻塞IO 可靠性是最好的,吞吐量也是非常同,适用于连接比较多,并且连接比较长(重操作)。例如 相册服务器。JDK7版本才支持。编程模型比较简单,需要操作系统来支持。

同步、异步(请求)和阻塞、非阻塞(客户端)。

九、Java NIO的几个核心组件是什么?分别有什么作用?

Channel Buffer Selector

  channel类似于流,每个channel对应一个buffer缓冲区。channe会注册到selector

  selector 会根据channel上发生的读写事件,将请求交由某个空闲的线程处理。selector对应一个或者多个线程

buffer和channel都是可读可写的 

十、select,poll,epoll有什么区别?

他们是NIO中多路复用的三种实现机制,是由Linux操作系统提供的。

用户空间和内核空间:操作系统为了保护系统安全,将内核划分为两个部分,一个是用户空间,一个是内核空间。用户空间不能直接访问底层的硬件设备,必须通过内核空间。

文件描述符File Descriptor(FD):是一个抽象的概念,形式上是一个整数,实际上是一个索引值。指向内核中为每个进程维护进程所打开的文件记录表。当程序打开一个文件或者创建一个文件时,内核就会向进程返回一个FD。

select机制:会维护一个FD的结合fd_set。将fd_set从用户空间复制到内核空间,激活socket。x64 2048  fd_set是一个数组结构

poll机制:和select机制是差不多的,把fd_set结构进行了优化,FD集合的大小 就突破了操作系统的限制。pollfd结构来代替fd_set,通过链表实现的。

epoll机制:event poll ; epoll不再扫描所有的FD,只将用户关心的FD事件存放到内核的一个事件表当中。这样,可以减少用户空间与内核空间之间需要拷贝的数据。

简单总结:操作方式   底层实现   最大连接数  IO效率

select             遍历        数组        受限天内核        一般

poll                 遍历        链表        无上限                一般

epoll                事件回调  红黑树        无上限          高

java 的NIO当中是用的那种机制?在windows下,WindowsSelectorProvider.而Linux下,2.6版本以上就是EpollSelectorProvider,否则就是默认的PollSeelctorProvider

十一、描述下Http和Https的区别?

http:是互联网上应用最为广泛的一种网络通信协议,基于Tcp,可以使浏览器工作更为高效,减少网络传输。

https:是http的加强版,可以认为是Http+ssl(Secure Socket Layer)。在Http的基础上增加了一系列的安全机制。一方面保证数据传输安全,另一方面对访问者增加了验证机制。是目前现行架构下,最为安全的解决方案。

主要区别:

1、http的连接是简单无状态的,Https的数据传输是经过证书加密的,安全性更高。

2、http是免费的,而Https需要申请证书,而证书通常是需要收费的,并且费用一般不低。

3、他们的传输协议不同,所以他们使用的端口也是不一样的,Http默认是80端口,而HTTPS默认是433端口

Https的缺点:

1、Https的握手协议比较费时,所以会影响服务的响应速度以及吞吐量。

2、Https也并不是完全安全的。他的证书体系其实并不是完全安全的。并且HTTPS在面对DDOS这样的攻击时,几乎起不到任何作用

3、证书需要费钱,并且功能越强大的证书费用越高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值