码上未来IT培训老师直接接听

400-029-09** 400-029-0997 转 36015
查看完整号码
扫码拨号
微信扫码拨号

关于Java的相关的面试题(二十二)

作者:码上未来CodingFuture 来源:码上未来CodingFuture 2023/2/25 16:39:07

程序员面试干货来啦,今天小编就先为大家整理出5道大厂面试时常...

程序员面试干货来啦,今天小编就先为大家整理出5道大厂面试时常见关于Java 的面试题。看看你能答对几道题呢!多多掌握此类面试题,就会增加面试通过的机率哦,后续还有其他类的面试题,请持续关注哟!
1.volatile 关键字是否能保证线程安全? 答 : 不能。虽然 volatile 提供了同步的机制,但是知识⼀种弱的同步机制,如需要强线程安全,还需要使⽤ synchronized 。 Java 语⾔提供了⼀种稍弱的同步机制,即 volatile 变量,⽤来确保将变量的更新操作通知到其他线程。当把变量声明为 volatile 类型后,编译器与运⾏时都会注意 到这个变量是共享的,因此不会将该变量上的操作与其他内存操作⼀起重排序。 volatile 变量不会被缓存在寄存 器或者对其他处理器不可⻅的地⽅,因此在读取 volatile 类型的变量时总会返回最新写⼊的值。 ⼀、 volatile 的内存语义是: 当写⼀个 volatile 变量时, JMM 会把该线程对应的本地内存中的共享变量值⽴即刷新到主内存中。 当读⼀个 volatile 变量时, JMM 会把该线程对应的本地内存设置为⽆效,直接从主内存中读取共享变量。 ⼆、 volatile 底层的实现机制 如果把加⼊ volatile 关键字的代码和未加⼊ volatile 关键字的代码都⽣成汇编代码,会发现加⼊ volatile 关键字的代码会多出⼀个 lock 前缀指令。 1 、重排序时不能把后⾯的指令重排序到内存屏障之前的位置 2 、使得本 CPU 的 Cache 写⼊内存 3 、写⼊动作也会引起别的 CPU 或者别的内核⽆效化其 Cache ,相当于让新写⼊的值对别的线程可⻅。 2. 请写出常⽤的 Java 多线程启动⽅式, Executors 线程池有⼏种常⽤类型? (1) 继承 Thread 类 public class java_thread extends Thread public static void main (String args[]) new java_thread().run(); System.out.println( ); public synchronized void run () System.out.println( ); (2) 实现 Runnable 接⼝ public class java_thread implements Runnable public static void main ( String args[] ) new Thread( new java_thread()).start(); System. out .println( ); public void run ( ) System. out .println( ); 在 Executor 框架下,利⽤ Executors 的静态⽅法可以创建三种类型的常⽤线程池: 1 ) FixedThreadPool 这个线程池可以创建固定线程数的线程池。 2 ) SingleThreadExecutor 是使⽤单个 worker 线程的 Executor 。 3 ) CachedThreadPool 是⼀个 ” ⽆限 “ 容量的线程池,它会根据需要创建新线程。 3. 创建 n 多个线程,如何保证这些线程同时启动?看清,是 “ 同时 ” 。 答:⽤⼀个 for 循环创建线程对象,同时调⽤ wait() ⽅法,让所有线程等待;直到最后⼀个线程也准备就绪后,调⽤ 同时启动所有线程。 ⽐如:给你 n 个赛⻋,让他们都在起跑线上就绪后,同时出发, Java 多线程如何写代码? 思路是,来⼀辆赛⻋就加上⼀把锁,并修改对应的操作数,如果没有全部就绪就等待,并释放锁,直到最后⼀辆赛⻋到场后唤醒所有的赛⻋线程。 代码参考如 下: public class CarCompetion // 参赛赛⻋的数量 protected final int 10 ; // 当前在起跑线的赛⻋数量 protected int 0 public class Car implements Runnable private int carNum; private null ; public Car ( int this this public void run () synchronized while try competion.wait(); catch e.printStackTrace(); competion.notifyAll(); startCar(); private void startCar () System.out.println( this ); try Thread.sleep( 3000 ); catch e.printStackTrace(); System.out.println( this ); public static void main (String[] args) new CarCompetion(); final Executors.newFixedThreadPool(carCompetion.totalCarNum); for ( int 0 carPool.execute( new 4. 同步和异步有何异同,在什么情况下分别使⽤它们? 答: 1. 如果数据将在线程间共享。例如正在写的数据以后可能被另⼀个线程读到,或者正在读的数据可能已经被另⼀个线程写过了,那么这些数据就是共享数 据,必须进⾏同步存取。 2. 当应⽤程序在对象上调⽤了⼀个需要花费很⻓时间来执⾏的⽅法,并且不希望让程序等待⽅法的返回时,就应该使⽤异步编程,在很多情况下采⽤异步途径往 往更有效率。 3. 举个例⼦ : 打电话是同步 发消息是异步 5.Java 线程中, sleep() 和 wait() 区别 答: sleep 是线程类 (Thread) 的⽅法;作⽤是导致此线程暂停执⾏指定时间,给执⾏机会给其他线程,但是监控状态依然保持,到时候会⾃动恢复;调⽤ sleep() 不会释放对象锁。 wait 是 Object 类的⽅法;对此对象调⽤ wait ⽅法导致本线程放弃对象锁,进⼊等 待此对象的等待锁定池。只有针对此对象发出 notify ⽅法 ( 或 notifyAll) 后本线 程才进⼊对象锁定池,准备获得对象锁进⾏运⾏状态。 希望这些面试题对你有所帮助!下一期我们会有关于其他大厂面试题。别忘了关注我们的公众号哦,预防走丢! 最后愿你前程似锦,在冬深 在初春 在夏至在秋末 在码上未来! 码上未来,成就你更好的未来!
END
添加微信咨询
夏老师 @大连码上未来IT培训

资深职业咨询规划师

微信号:155******12

立即咨询

“大连码上未来IT培训”是码上未来科技(大连)有限公司在教育宝平台开设的店铺,若该店铺内信息涉嫌虚假或违法,请点击这里向教育宝反馈,我们将及时进行处理。

机构评分

环境:5.0师资:5.0服务:5.0效果:5.0

公示信息

店铺名称:大连码上未来IT培训

单位名称:码上未来科技(大连)有限公司

账号名称:mswl(158******92)

所属城市:辽宁大连

入驻时长:6年

在线客服:在线聊

微信咨询

返回顶部