一、Java如何开启线程?怎么保证线程安全?
答:线程与进程的区别:进程是操作系统进行资源分配的最小单元。线程是操作系统进行任务分配的最小单元,线程隶属于进程。
如何开启线程?1.继承Thread类,重写run方法。2.实现Runable接口,实现run方法。3.实现Callable接口,实现call方法。通过FutureTask创建一个线程,获取到线程执行的返回值。4.通过线程池来开启线程。
怎么保证线程安全?核心思想就是加锁:1.JVM提供的锁,也就是Synchronized关键字。2.JDK提供的各种锁Lock.
二、Volatile和Synchronized有什么区别?Volatile能不能保证线程安全?DCL(DoubleCheckLock)单例为什么要加Volatile?
答:1.Synchronize关键字,用来加锁,Volatile只是保持亦是的线程可见性。通常适用于一个线程写,多个线程读的场景。
2.Volatile关键字不能保证线程安全,只能保证线程可见性,不能保证原子性。
3.Volatile防止指令重排,在DCL中,防上高并发情况下,指令重排造成的线程安全问题。
三、Java线程锁机制是怎么样的?偏向锁、轻量级锁、重量级锁有什么区别?锁机制是如何升级的?
答:1.Java的锁就是在对象的Markword中记录一个锁状态,无锁、偏向锁、轻量级锁、重量级锁对应不同的锁状态。
2.Java的锁机制就是根据资源竟争的激烈程度不断进行锁升级的过程。
四、谈谈你对AQS的理解。AQS如何实现可重入锁?
答:1.AQS是一个Java线程同步的框架,是JDK中很多锁工具的核心实现框架。
2.在AQS中,维护了一个信号量state和一个线程组成的双向链表队列,其中,这个线程队列就是用来给线程排队的,而state就像是一个红绿灯,用来控制线程排队或才放行的,在不同的场景下,有不同的意义。
3.在可重入锁这个场景下,state就用来表示加锁的次数,0表示无锁,每加一次锁state就加1,释放锁state就减1.
五、TCP和UDP有什么区别?TCP为什么是三次握手,而不是两次?
答:TCPTransferControlProtocol是一种面向连接的,可靠的,传输层通信协议。
特点:好比打电话,面向连接的,点对点的通信,高可靠的,效率比较低,占用的系统资源比较多。
UDPUserDatagramProtocol是一种无连接的,不可靠的,传输层通信协议。
特点:好比广播,不需要连接,发送方不管接收方有没有准备好,直接发消息;可以进行广播发送。传输不可靠,有可能丢失消息;效率比较高,协议比较简单,占用的系统资源比较少。
TCP建立连接三次握手,断开连接四次挥手。如果是两次握手,可能造成连接资源浪费的情况。
————————————————
版权声明:本文为CSDN博主「断然然」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zlich/article/details/122354464
|