Java软件工程师面试常见问题整理3

21.题目:synchronized 和 volatile 的区别是什么br>         volatile 本质是在告诉 JVM 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
        volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的。
         volatile仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。
        volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞
        volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。

 

22.题目:说一下 Runnable 和 Callable有什么区别br>         Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已。
         Callable接口中的 call()方法是有返回值的,是一个泛型,和Future、FutureTask 配合可以用来获取异步执行的结果。

 

23.题目:线程池中 submit()和execute()方法有什么区别br>         接收的参数不一样。
        submit 有返回值,而 execute 没有。
        submit 方便 Exception 处理。

 

24.题目:synchronized 和 Lock 有什么区别br>         首先synchronized是Java内置关键字,在JVM 层面,Lock是个Java类。
        synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁。
        synchronized会自动释放锁(a线程执行完同步代码会释放锁;b线程技行过程中发生异常会释放锁),Lock 需在finally 中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁。
        用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而 Lock 锁不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了。
        synchronized 的锁可重入、不可中断、非公平,而 Lock 锁可重入。可判断、可公平。
         Lock 锁适合大量同步的代码的同步问题,synchronized 锁适合代码少量的同步问题。

 

25.题目:说一下 TCP 粘包是怎么产生的br>         发送方产生粘包
        采用TCP协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据;但当发送的数据包过于的小时,那么TCP协议默认的会启用Nagle算法,将这些较小的数据包进行合并发送;这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。
        

4906b302694b4696a10414b2ae018e85.png

 

145336228a754e348b4b0acff636af71.png

26.题目:synchronized和ReentrantLock 区别是什么nbsp;
        synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然 ReentrantLock 是类,那么它就提供了比 synchronized更多更灵活的特性,可以被维承、可以有方法、可以有各种各祥的类变量,ReentrantLock比synchronized的扩展性体现在几点上:
        ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁。
        ReentrantLock 可以获取各种锁的信息。
         ReentrantLock 可以灵活地实现多路通知。
        另外,二者的锁机制其实也是不一样的:ReentrantLock 底层调用的是 Unsafe 的park方法加锁,synchronized操作的应该是对象头中 mark word。

 

27.题目:TCP 为什么要三次握手,两次不行吗什么br>         为了实现可靠数据传输,TCP 协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。
        如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。

 

28.题目:基于 TCP 和 UDP 的 Socket 编程的主要步骤br>                 1、基于 TCP 协议的 Socket 编程的主要步骤:
服务端:
        指定本地的端口创建 ServerSocket 实例,用来监听指定端口的连接请求。
        通过accept()方法返回的 Socket 实例,建立了一个和客户端的新连接。
        通过 Sockect 实例获取 InputStream 和OutputStream 读写数据。
        数据传输结束,调用 socket 实例的 close(方法关闭连接。

客户端:
        指定的远程服务器 IP 地址和端口创建 Socket 实例。
        通过 Socket 实例获取 InputStream和OutputStream 来进行数据的读写。
        数据传输结束,调用 socket 实例的 close()方法关闭连接。
              

                  2、基于 UDP 协议的 Socket 编程的主要步骤;
服务端:
        指定本地端口创建 DatagramSocket 实例。
        通过字节数组,创建DatagramPacket 实例,调用DatagramSacket实例的receive()方法,用 DatagramPacket 实例来接收数据。
        设置DatagramPacket 实例返回的数据,调用DatagramSocket 实例的 send()方法来发送数据。
        数据传输完成,调用 DatagramSocket 实例的 close()方法。

客户端:
        创建 DatagramSocket 实例。
        通过 IP 地址端口和数据创建 DatagramSocket 实例,调用DatagramSocket 实例 send()方法发送数据包
        通过字节数组创建 DatagramSocket 实例,调用DatagramSocket实例receive()方法接受数据包。
        数据传输完成,调用 DatagramSocket 实例的close()方法。

 

 

29.题目:Java中的设计模式有哪些br>         创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
        结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
        行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

 

30.题目:XML文档定义有几种形式何区别br>         XML 文档定义分为 Schema 和 DTD 两种形式
        Schema 是对 XML 文档结构的定义和描述,其主要的作用是用来约束XML文件,并验证 XML 文件有效性。
        DTD 的作用是定义 XML的合法构建模块,它使用一系列的合法元素来定义文档结构。
区别:
        Schema 本身也是 XML 文档,DTD 定义跟 XML 无关。
        Schema 文档结构性强,各元素之间的嵌套关系非常直观:DTD文档的结构是”平铺型”的,如果定义复杂的 XML 文档,很难把握各元素之间的嵌套关系。
        Schema 可以定义元素文本的具体类型;DTD 只能指定元素含有文本。
        Schema 支持元素节点顺序的描述;DTD 没有提供无序情况的描述;
        Schema 可以很好满足命名空间;DTD 不可以。

 

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91611 人正在系统学习中

来源:不吃橘子的橘猫

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年11月21日
下一篇 2022年11月21日

相关推荐