java线程是程序执行流的最小单元,多线程优点就是最大限度的利用CPU的空闲时间来处理其他任务。并且很多企业不可避免地会使用多线程的方式处理数据,所以光看这些我们就应该java线程知识点的重要性,那么下面我们就给大家分享一些java多线程面试题!
1.线程之间如何共享数据?
(1)多个线程对共享数据的操作是相同的,那么创建一个Runnable的子类对象,将这个对象作为参数传递给Thread的构造方法,此时因为多个线程操作的是同一个Runnable的子类对象,所以他们操作的是同一个共享数据。比如:买票系统,所以的线程的操作都是对票数减一的操作。
(2)多个线程对共享数据的操作是不同的,将共享数据和操作共享数据的方法放在同一对象中,将这个对象作为参数传递给Runnable的子类,在子类中用该对象的方法对共享数据进行操作。比如实现生产者和消费者模型。
(3)多个线程对共享数据的操作是不同的, 用内部类的方式去实现,创建Runnable的子类作为内部类,将共享对象作为全局变量,在Runnable的子类中对共享数据进行操作。
2.线程的start()和run()方法的区别?
start()方法表示启动一个新的线程,在JVM内存中会开启一个新的栈空间。而run()方法只是普通方法调用,不会启动新的线程。
3.实现线程的方式分别是什么?
第一种:继承Thread;
第二种:实现Runnable接口,这种方式使用较多,面向接口编程一直是被推崇的开发原则。
第三种:实现Callable接口用来实现返回结果的线程;
4.什么是乐观锁和悲观锁?
(1)乐观锁:乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
(2)悲观锁:对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized,不管三七二十一,直接上了锁就操作资源了。
5.多线程有什么用?
(1)发挥多核CPU的优势
随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。 单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了 。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。
(2)防止阻塞
从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。
6.什么是多线程的上下文切换?
多线程的上下文切换是指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。
可以说,java多线程是衡量一名 Java 程序员是否资深的关键标准之一,并且多线程也是面试必考的知识点之一。因此大家一定要掌握多线程编程和应用的技巧!最后大家如果想要了解更多java面试题知识,敬请关注奇Q工具网。
推荐阅读: