各种编程语言不断崛起,唯独Java牢牢占据着老大的位置。目前,几乎90%的大中型互联网应用系统都是以Java为服务器端开发的首选。因此,也吸引了很多年轻人投入到Java学习中。Java有什么找工作的技巧吗?多线程面试练习有哪些?下面一起来看看吧。 1。Java创建线程后,直接调用start()方法和run()有什么区别? 启动一个线程就是调用start()方法使该线程所代表的虚拟处理器处于可运行状态。意味着它可以被JVM调度和执行。这并不意味着线程将立即运行。run()方法可以生成一个必须退出标志来停止线程。在这里,小编建了一个前端学习交流按钮群:132667127,自己整理的最新前端资料和进阶开发教程。有需要的可以加群一起学习交流 2。线程B是怎么知道的?线程A修改变量? volatile修改变量 synchronized修改修改变量的方法 wait/notify whilepolling 3.与Volatile和CAS相比同步? synchronized是悲观锁是抢占式的,会导致其他线程阻塞。 volatile提供多线程共享变量可见性,禁止指令重排序优化。 CAS是一种基于冲突检测的乐观锁(非阻塞) 4。线程间通信,wait和notify的理解和使用? 1wait和notify必须配合synchronized关键字使用。 2wait方法释放锁,notify方法不释放锁。 3还有一点需要注意的是,当涉及到线程间的通信时,肯定会用到validate修饰。 5.使用定时线程? 1。普通线程的死循环 2。使用定时器 3。使用调度线程池ScheduledExecutorService 6。线程同步方法? wait():让一个线程进入等待状态,释放持有对象的锁。 sleep():让正在运行的线程进入睡眠状态。它是一个静态方法。调用此方法来捕获InterruptedException。 notify():唤醒一个处于等待状态的线程。注意,调用该方法时,不能唤醒某个处于等待状态的线程,而是由JVM决定唤醒哪个线程,而不是按优先级。 notityAll():唤醒所有处于等待状态的线程。注意这里不是给所有被唤醒的线程都上对象锁,而是让它们竞争。 7。进程和线程的区别? 1。调度:线程是调度和分配的基本单位,进程是拥有资源的基本单位。 2。并发性:不仅进程可以并发执行,同一个进程的多个线程也可以并发执行。 3。拥有资源:进程是拥有资源的独立单元。线程不拥有系统资源,但可以访问属于进程的资源。 4。系统开销:创建或取消进程时,由于系统必须为其分配和回收资源,因此系统开销明显大于创建或取消线程时的开销。但是,一个进程有一个独立的地址空间。一个进程崩溃后,不会影响保护模式下的其他进程,线程只是一个进程中不同的执行路径。线程有自己的栈和局部变量,但线程之间没有单独的地址空间。一个线程的死亡意味着整个进程的死亡,所以多进程程序比多线程程序更健壮,但是在进程间切换时,消耗的资源更大,效率更低。 8.什么是线程安全? 如果你的代码所在进程有多个线程同时运行,而这些线程可能同时运行这段代码。如果每次运行的结果都和单线程运行的结果一样,并且其他变量的值都和预期的一样,就是线程安全的。一个线程安全的计数器类的同一个实例对象即使被多个线程使用也不会被误算。显然,您可以将集合类分为两组,线程安全的和非线程安全的。 9.线程的几种状态? 1。新状态(New):一个线程对象是新创建的。 2。就绪状态(Runnable):线程对象创建后,其他线程调用该对象的start()方法。该状态的线程位于“可运行线程池”中,变为可运行状态,只等待获得CPU的使用权。也就是说,处于就绪状态的进程拥有除CPU之外的所有运行所需的资源。 3。运行状态(Running):处于就绪状态的线程获取CPU并执行程序代码。 4。阻塞状态(Blocked):阻塞状态是指线程由于某种原因放弃了CPU的使用权,暂时停止运行。直到线程进入就绪状态,才有机会进入运行状态。 的拦截分为三种: (1)、等待阻塞:正在运行的线程执行wait()方法后,线程会释放所有占用的资源,JVM会将线程放入“等待池”。进入该状态后,无法自动唤醒。它必须依赖其他线程调用notify()或notifyAll()方法才能被唤醒。 (2)。如果同步锁被另一个线程占用,JVM会将该线程放入“锁池”。 (3)、其他阻塞:当一个正在运行的线程执行了sleep()或join()方法,或者发送了I/O请求时,JVM会将该线程置于阻塞状态。当sleep()状态超时,join()等待线程终止或超时,或者I/O处理完成,线程再次转入就绪状态。 5.死亡状态(Dead):线程结束执行或因异常退出run()方法,线程结束生命周期。 10。volatile变量和原子变量有什么区别? volatile变量和atomic变量看起来很像,但它们的功能不同。volatile变量可以保证优先级关系,即写操作会先于后续的读操作发生,但不保证原子性。比如count变量被volatile修饰,count++操作就不是原子的。AtomicInteger类提供的原子方法可以使这个操作成为原子操作。例如,getAndIncrement()方法将自动执行增量操作,将当前值增加一。其他数据类型和引用变量也可以执行类似的操作。
