java 知识点突击-(111-120)

Posted 栗子~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 知识点突击-(111-120)相关的知识,希望对你有一定的参考价值。

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


java 知识点扫盲目录

https://blog.csdn.net/weixin_38316697/article/details/121991582

java 知识点突击-(111-120)

111 进程和线程的区别?

(1)地址空间比较:
同一进程内的线程共享本进程的地址空间,而进程之间的资源说独立的。

(2)资源拥比较有:
同一进程内的线程共享本进程的资源,而进程之间的资源说独立的。

(3)多进程与多线程的健壮性比较:
一个进程崩溃后,在保护模式下不会对其他进程造成影响,但一个线程崩溃,整个进程都死掉,
所以多进程要比多线程健壮。

(4)进程和线程切换开销比较:
【进程切换】消耗的资源大于【线程切换】。
【进程切换】涉及到虚拟地址空间的切换而【线程切换】则不会。因为每个进程都有自己的虚拟地址空间,
而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。
(如:涉及共享某些变量的并发操作时,只能用多线程)。


112 守护线程是什么?

服务线程,准确地来说就是服务其他的线程。


113 说一下 runnable 和 callable 有什么区别?

Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;
Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。


114 VM中 的锁优化?

114::01 偏向锁

目的:
消除数据在无竞争情况下的同步语句。
特点:
a、大部分情况是没有竞争的,所以可以通过偏向来提高性能;
b、所谓的偏向,就是偏心,即锁会偏向于当前已经占有锁的线程;
c、只要没有竞争,获得偏向锁的线程,在将来进入同步块,不需要做同步(当其他线程请求相同的锁时,偏向模式结束);

即如果在接下来的执行过程中,该锁一直没有被其他线程获取,则持有偏向锁的线程将永远不需要再进行同步操作。

d、将对象头Mark的标记设置为偏向,并将线程ID写入对象头Mark;

注:
偏向模式在竞争激烈的场合,偏向锁会增加系统负担,因为每次线程申请锁时,都要判断当前线程是否是偏向锁偏向的线程,在竞争激烈(每次申请锁的线程都不相同)下,就会导致多做一些无用的判断,因此会增加系统负担。

开启偏向锁,并设置不延迟开启:
-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
关闭偏向锁
-XX:-UseBiasedLocking

注: 偏向锁默认是开启的,并且在开启的前4S内,不会开启偏向锁。

114::02 轻量锁

当系统做偏向级锁的操作失败,那么就可能会做轻量级锁操作。轻量级锁会尽可能的不动用操作系统级别的锁(因为性能低下),而是在应用级别来解决锁的问题
特点:
[1] 如果轻量级锁失败,表示存在竞争,就会升级为重量级锁(常规锁)。
[2] 在没有锁竞争的前提下,可以减少传统锁使用所带来的性能损耗。
[3] 在竞争激烈时,轻量级锁会多做很多额外操作,导致性能下降。
强调:
轻量锁并不是用来替代重量锁的,它设计的初衷是在没有多线程竞争下的前提下,减少传统的重量锁使用操作系统互斥量所产生的性能消耗。

114::03 自旋锁

当竞争存在时,如果线程可以很快获得锁,那么可以不在OS层面挂起线程,只是让线程做几个空操作(自旋),譬如ConcurrentHashMap当中,通过tryLock来不断尝试获取锁,而不是直接通过lock阻塞线程。

[1] 如果同步块很长,自旋失败,会降低系统性能。
[2] 如果同步块很短,自旋成功,节省线程挂起切换CPU时间片,以提升系统性能。

总结:
[1] 偏向锁、轻量级锁、自旋锁都不是Java语言层面的锁优化方法。
[2] 内置于JVM中的获取锁的优化方法和获取锁的步骤:
a. 如果偏向锁可用,会先尝试获取偏向锁。
b. 如果偏性锁失败,并且轻量级锁可用,那么就尝试使用轻量级锁。
c. 以上都失败,会尝试自旋锁
d. 如果再失败,最后尝试常规锁,使用OS互斥量在操作系统层实现锁


115 多线程锁的升级原理是什么?

在Java中,锁共有四种状态,级别从低到高分别是:无状态锁、偏向锁、轻量级锁和重量级锁,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。


116 ThreadLocal是什么?有哪些使用场景?

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如web服务器)使用线程局部变量的时候要特别小心,这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java应用就存在内存泄露的风险


117 线程是什么?

线程是比进程更轻量级的调度执行单位,目前j【java线程】是进行处理器资源调度的【最基本单位】.


118 java线程是什么?

以【HotSpot】为例,所有的【java线程】都是直接映射到【操作系统】的【原生线程】上来实现的,而且中间没有间接结构,所以【HotSpot】是不会去干涉【java线程】的调度的,它是全权交给了操作系统来处理的,因此,一些线程相关的调度操作都是由【操作系统】来控制的,比如,何时冻结,何时唤醒,该给线程分配多少处理器执行时间,该把线程分配给某个处理器来执行,这些都是由【操作系统】来绝对的。


119 线程的6种状态?

1)新建-【new】
创建后尚未启动的线程
2)运行-【runnable】
因为【java线程】是直接映射到【操作系统】的【原生线程】上来实现的,因此只要观察【操作系统】的【原生线程】的Running【运行】状态和Reaby【就绪】状态就行。
3)无限期等待-【waiting】
处于这种状态的线程不会被分配到其他处理器来执行,只能通过其他的线程的显式唤醒,来结束无线等待状态。
以下方法能让线程陷入无线等待状态:

没有设置TimeOut参数的Object::wait()方法
没有设置TimeOut参数的Thread::join方法

4)期限等待-【Timed waiting】
跟无限期等待状态【waiting】线程很像,但跟它的最主要的区别在于:
无需等待其他线程的显示唤醒,过一段时间后,他们会被【操作系统】自动唤醒。
以下方法能让线程陷入期限等待状态:

Thead::sleep方法
设置了TimeOut参数的Object::wait()方法
设置了TimeOut参数的Thread::join方法

5)阻塞-【blocked】
线程被阻塞了,【阻塞状态】和【等待状态】的区别是【阻塞状态】在等待着获取到一个【排它锁】,这一事件将在另外一个线程放弃这个【排他锁】的时候发生,而【等待状态】的线程是在等待一段时间,或者被其他线程执行显示唤醒的行为时唤醒。
6)结束-【Terminated】
已终止线程的线程状态,线程已经结束执行。


120 线程的生命周期?


创作不易、点关注、不迷路

点击主页、更精彩 !!!

以上是关于java 知识点突击-(111-120)的主要内容,如果未能解决你的问题,请参考以下文章

java 知识点突击-(121-130)

java 知识点突击-(101-110)

java 知识点突击-(171-180)

java 知识点突击-(161-170)

java 面试知识点突击-(61-70)

java 面试知识点突击-(41-50)