java面试题2022-1-9(一些关键字的用法)
一.final有哪些用法
- 被final修饰的类不可以被继承。
- 被final修饰的变量不可以被修改,被修饰的引用,引用指向内容可变,表示引用不可变。
- 被final修饰的方法,不可以被重写
- 被final修饰的常量会加载到内存中去
- 被final修饰的方法,JVM会尝试将其内联,提高运行效率
例如:String类不可以被继承
二.synchronized的用法
- 修饰一个类:其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象;
Class ClassName{
public void method(){
synchronized(ClassName.class){
//todo
}
}
}
其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象
2. 修饰一个方法
public synchronized method(){
//todo
}
在定义接口方法时不能使用synchronized关键字。
构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。
synchronized 关键字不能被继承 。如果子类覆盖了父类的 被 synchronized 关键字修饰的方法,那么子类的该方法只要没有 synchronized 关键字,那么就默认没有同步,也就是说,不能继承父类的 synchronized。
3. 修饰静态代码块
public synchronized static void method(){
//todo
}
静态方法是属于类的而不属于对象的 。同样的, synchronized修饰的静态方法锁定的是这个类的所有对象
4. 修饰代码块
public void method(){
synchronized(this){
//todo
}
}
当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
修饰静态方法其实是类锁,区别于对象锁
对象锁和类锁的区别
1.类锁是对静态方法使用synchronized关键字后,无论是多线程访问单个对象还是多个对象的sychronized块,都是同步的。
2.对象锁是实例方法使用synchronized关键字后,如果是多个线程访问同个对象的sychronized块,才是同步的,但是访问不同对象的话就是不同步的。
三.String StringBuffer StringBuilder的关系和区别
- String是一个引用类型,被final修饰,不可以被继承
- StringBuffer也是final修饰,不可被继承,但是toString()方法被synchronized修饰,做了同步处理(线程安全)
- StringBuilder也是final修饰,继承了和他们差不多的接口(线程费安全)
总结
java基础中的一些关键字和锁的概念,简单的说了对象锁和类锁的区别,类锁实际上是不存在的,只是方便理解锁定义的一个名词