1.什么是线程?
线程是指操作系统中的一种执行单元,它是进程中的一部分,可以看作是轻量级的进程。与进程不同的是,线程共享同一进程的地址空间和系统资源,如打开文件和信号处理等,但每个线程都有自己的程序计数器(PC)和栈,用于执行代码和存储局部变量等数据。
2。线程和进程有什么区别?
线程和进程都是操作系统中的执行单元,但它们有以下区别:
(1)资源占用:进程是系统中分配资源的基本单位,每个进程都有自己独立的内存空间、文件句柄、网络连接等系统资源,它们之间相互独立。而线程是进程中的一个执行单元,它与同一进程中的其他线程共享同一内存空间和系统资源,包括文件句柄、网络连接、进程上下文等,因此线程之间的通信和切换比进程更快,且线程占用的资源更少。
(2)调度和切换:操作系统调度进程和线程的方式不同。进程调度和切换需要保存和恢复进程的上下文,包括CPU寄存器、内存状态、打开文件和网络连接等信息,因此进程切换的开销较大。而线程切换只需要保存和恢复线程自己的上下文,因此线程切换的开销较小。
(3)安全性:线程之间共享同一内存空间,因此在多线程编程中需要考虑线程安全问题,例如多个线程同时访问同一变量时可能会出现数据竞争的情况。而进程之间相互独立,可以通过进程间通信(IPC)来进行数据传输和协作。
(4)创建和销毁:创建新进程的开销比创建新线程的开销大,因为新进程需要复制父进程的全部资源和状态。销毁进程时需要回收系统资源和清理进程状态,也比销毁线程的开销大。
3.线程使用场景?
线程通常用于编写多任务和并发程序,
4.如何在Java中出实现多线程?
继承Thread类、实现Runnable接口
5.Thread类中的start()和run()有什么区别?
start()方法用于启动一个新线程,在新线程中异步执行run()方法中的代码;而run()方法是线程的执行体,包含了线程要执行的代码,但它不会启动一个新线程,而是在当前线程中同步执行。
6.启动一个线程是用run()还是start()?
start()
7.Java中Runnable和Callable有什么不同?
- 返回值:Runnable接口的run()方法没有返回值,而Callable接口的call()方法可以返回一个结果,该结果可以通过Future对象获取。
- 异常处理:Runnable接口的run()方法不能抛出异常,而Callable接口的call()方法可以抛出异常,需要通过try-catch语句进行处理。
- 使用方式:Runnable接口通常用于编写简单的线程任务,而Callable接口通常用于编写复杂的、需要返回结果的线程任务。
- 返回值类型:Callable接口的call()方法返回值类型可以通过泛型进行指定,而Runnable接口没有返回值类型。
8.你如何理解线程安全的?线程安全问题是如何造成的?
(1)线程安全是指在多线程环境下,对共享资源的访问不会出现数据的不一致、丢失或重复等问题。线程安全的代码可以在多个线程中并发执行,而不会产生意外的结果或错误。
(2)线程安全问题通常由多个线程同时访问共享资源而引起的。
9.多线程共用一个数据变量需要注意什么?
(1)线程安全:多个线程同时访问同一变量时,可能会出现数据竞争的情况。为了避免数据竞争,需要使用同步机制(如synchronized关键字、Lock接口等)来保证线程安全。
(2)可见性:当一个线程修改了变量的值时,其他线程可能无法立即看到变化。为了保证可见性,可以使用volatile关键字,保证对变量的读写操作是立即可见的。
(3)原子性:某些操作可能需要多个步骤才能完成,如果在多线程环境下没有采取同步机制,可能会导致部分步骤被其他线程插入,从而导致意外的结果。为了保证原子性,可以使用原子操作类(如AtomicInteger、AtomicLong等)。
(4)有序性:多个线程同时访问同一变量时,可能会出现读写顺序混乱的情况。为了保证有序性,可以使用同步机制或者volatile关键字来保证变量的读写顺序。
(5)上下文切换:当多个线程同时访问同一变量时,会出现上下文切换的情况,从而影响程序的性能。为了避免上下文切换,可以使用分离锁、非阻塞算法等技术,减少线程之间的竞争。
10. 多线程保证线程安全一般有几种方式?
同步机制
11. 用什么关键字修饰同步方法?
synchronized
12.synchronized加在静态方法和普通方法区别?
当synchronized关键字加在静态方法上时,它会锁定该方法所属的类。
当synchronized关键字加在普通方法上时,它会锁定该方法所属的对象。
13.Java中synchronized和ReentrantLock有什么不同?
(1)锁的获取方式:synchronized关键字是隐式锁(内置锁),它可以自动获取和释放锁。而ReentrantLock是显式锁,需要手动获取和释放锁。
(2)锁的可重入性:synchronized是可重入锁,同一个线程可以多次获取同一个锁。而ReentrantLock也是可重入锁,但需要手动释放锁。
(3)锁的公平性:synchronized关键字是非公平锁,无法保证线程获取锁的顺序。而ReentrantLock可以是公平锁和非公平锁,可以通过构造函数指定锁的公平性。
(4)条件变量:ReentrantLock提供了Condition接口,可以使用Condition实现更灵活的线程等待/通知机制。而synchronized关键字没有提供类似的机制。
(5)性能:synchronized是JVM内置的关键字,是Java语言层面的同步机制,因此具有更高的执行效率和更好的可移植性。而ReentrantLock是基于JUC(java.util.concurrent)框架实现的,它提供了更多的高级特性和灵活性,但会带来一定的性能开销。
14.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不可,锁被占用。
标签:Java,synchronized,十六,笔记,关键字,线程,接口,进程,多线程 From: https://www.cnblogs.com/wgh123/p/17504461.html