三一重工8.14面试
1.问你一个小的问题,如何用程序实现一秒执行一次方法呢?
一开始没有回答出来,直接说了for循环,面试官说,那我要是执行到明年呢?还是用for循环吗?
public class MultiThread { public static void main(String[] args) throws InterruptedException { while(true){ A(); Thread.sleep(1000); } } public static void A(){ System.out.println("这是方法A"); } }
2. synchronized与Lock的区别
只回答出来了Lock是一个接口,而Synchronized是Java的关键字,其他都没有回答上来,看来八股还是没有看完。
- Lock是一个接口,而Synchronized是java的一个关键字。
- Synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁;而lock发生异常时,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生。
- Synchronized可以给类、对象、代码块加锁,而Lock只能给代码加锁。
- 通过Lock可以知道有没有成功获取锁,而Synchronized却无法办到。
3.Synchaonized如何实现加锁?给对象加锁,给该类加锁,或者是.class文件加锁,举例
给普通方法加锁——等价与给该对象加锁
// 普通方法加Synchronized class Test{ public synchronized void test(){ //代码块 } }给该对象加锁:
class Test{ public void test(){ synchronized (this){ } }给静态方法加锁——相当于给该类加锁——也相当于给该类的class文件加锁
class Test{ public static synchronized void test(){ //代码块 } }给该类的class文件加锁
class Test{ public void test(){ synchronized(Test.class){ } //代码块 } }
4.多线程下,访问,出现数据不一致如何解决?
一开始回答的是加互斥锁,后来说了使用了volatile关键字,保证可见性
5.你知道泛型,那已知一个泛型,那如何返回一个该泛型的列表呢?
(面试看了简历,我写了泛型,结果G)
自定义泛型方法
import java.util.ArrayList; import java.util.List; // 自定义泛型 public class generic_paradigm { public static void main(String[] args) { Car car = new Car(); List<Double> list = car.B(0.2); System.out.println(list); } } class Car{ // 普通方法 public <T> List<T> B(T t){ List<T> list = new ArrayList<>(); for(int i = 0;i < 10;i++){ list.add(t); } return list; } }自定义泛型类:
//调用:public class generic_paradigm { public static void main(String[] args) { Tiger tiger = new Tiger("小王",1,2.0,"haha"); System.out.println(tiger); } }class Tiger<T,R,M>{ String name; T t; R r; M m; // 构造器使用泛型 public Tiger(String str,T t,R r,M m){ this.name = str; this.m = m; this.r =r; this.t = t; } @Override public String toString() { return "Tiger{" + "name='" + name + '\'' + ", t=" + t + ", r=" + r + ", m=" + m + '}'; } }