基础知识点三

35.并行和并发有什么区别?

并行:同时执行任务;并发:同一事件段内执行多个事件

并行发生在不同实体上,并发发生在同一实体上

36.线程和进程的区别?

进程:是并发执行的程序在执行过程中分配和资源管理的基本单元;线程:是进程的一个执行单元,是进程内调度实体,比进程更小的独立运行的基本单元。线程也被称为轻量级进程

37.守护线程是什么?

守护线程,是个服务线程,即是服务其他线程,其他线程只有一种就是用户线程,java线程分2种,1、守护线程,比如垃圾回收线程;2、用户线程,就是应用程序里的自定义线程。

38.创建线程有哪几种方式?

1、继承Thread类,实现run方法;2、通过Runnable接口创建线程类;3、Callable接口和FutureTask类创建线程

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

runnable 没有返回结果,callable有返回结果;futureTask的get方法获取callable的返回结果,该方法阻塞

40.线程有哪些状态?

五种状态:新建、就绪(可运行)、运行、阻塞、死亡

41.sleep() 和 wait() 有什么区别?

sleep()正在执行的线程主动让出CPU,不会释放同步资源锁;wait()释放同步资源锁(也就是synchronized所获得的锁),以便正在等待该资源的线程继续运行,只有调用notify方法,才能解除wait状态

42.notify()和 notifyAll()有什么区别?

notify()只随机唤醒一个wait线程;notifyAll()唤醒所有wait线程

43.线程的 run()和 start()有什么区别?

直接调用run()方法的话,仅仅是普通方法的运行,不会创建线程;调用start()方法,会创建线程,运行run()方法体

44.创建线程池有哪几种方式?

通过Executors提供四种线程池,分别为:

1、newCachedThreadPool创建一个可缓存线程池,灵活回收空闲线程,若没有可用线程,创建新的线程;

2、newFixedThreadPool创建可指定长度的线程池,超出的线程会在队列中等待;

3、newScheduledThreadPool创建可指定长度的线程池,支持定时或周期性的任务执行;

4、newSingleThreadExecutor创建单线程的线程池,也就是相当于单线程串行执行所有任务

46.线程池中 submit()和 execute()方法有什么区别?

submit()可以执行有返回值的任务;execute()执行没有返回值的任务

47.在 java 程序中怎么保证多线程的运行安全?

线程安全三个方面体现。

1、原子性,同一时刻只能有一个线程对数据进行操作(synchronized,Lock);

2、可见性,一个线程对主内存修改能及时地被其他线程看到(Volatile,synchronized,Lock);

3、有序性,即程序执行的顺序按照代码的先后顺序执行,java模型中,允许编译器和处理器对指令重排序,重排序不会影响到单线程的执行,却会影响到多线程并发执行的正确性(Volatile,synchronized,Lock);

当在处理并发编程的时候,只要程序满足了原子性,可见性和有序性,那么程序就不会发生脏数据的问题,也就是线程安全。

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

锁从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁,这几个状态随着竞争逐渐升级,锁可以升级不能降级

49.什么是死锁?

 死锁指由两个或者多个线程相互持有对方所需要的资源,导致这些线程相互等待对方的资源而处于等待状态,无法继续执行

50.怎么防止死锁?

产生死锁条件:

1、互斥,一个资源每次只能被一个进程使用;2、请求与保持,一个进程申请新的资源的同时保持对原有的资源的占有;

3、不可剥夺,资源申请者不能强行从资源占有者的手中夺取,资源只能由占有者自愿释放;4、循环等待,若干进程之间形成一种头尾相连的循环等待资源关。

只要系统发生死锁,上述条件一定成立,只要上述条件之一不满足,就不会发生死锁。

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

 ThreadLocal可以叫做线程本地变量,常用场景:数据库连接,session管理

52.说一下 synchronized 底层实现原理?

synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。

Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。

53.synchronized 和 volatile 的区别是什么?

  • volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  • volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
  • volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
  • volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
  • volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

54.synchronized 和 Lock 有什么区别?

synchronized 是一个关键字,不可以判断锁的状态,Lock是一个类,可以判断锁的状态;synchronized 线程获取不到锁,一直处于等待状态,Lock尝试获取锁,可以不用等待

55.synchronized 和 ReentrantLock 区别是什么?

这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。

56.说一下 atomic 的原理?

当线程写数据的时候,先对内存中要操作的数据保留一份旧值,真正写的时候,比较当前的值是否和旧值相同,如果相同,则进行写操作。如果不同,说明在此期间值已经被修改过,则重新尝试。

原文地址:https://www.cnblogs.com/wbjgogogo/p/10536163.html