三一重工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 +
'}';
}
} 
