Java多线程零碎知识点

知识点

64位数据类型的操作

java内存模型要求,读写一个变量必须是原子的,但是对于非volatile类型的long和double变量,JVM允许将64位的读写操作分解为两个32位操作。可以使用volatile来声明或者使用锁来保护它们。

守护线程(Daemon)

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 。两者几乎没有区别,唯一的不同之处就在于虚拟机何时结束运行。

守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个守护线程,这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

可以通过调用Thread对象的setDaemon(true)方法来将线程转换为守护线程,同时需要注意以下几点:

  1. 必须在thread.start()之前设置线程为守护线程
  2. 在Daemon线程中产生的新线程也是Daemon的
  3. 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任意时间甚至在一个操作的中间发生中断

JVM关闭

JVM在正常关闭之前(不是被强行关闭)会先去调用所有已注册的关闭钩子,所谓的关闭钩子是指通过Runtime.getRuntime().addShutdownHook(thread)注册的但尚未开始的线程,JVM并不能保证关闭钩子的调用顺序。

创建线程的方式

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口
  4. 通过线程池的方式

对比:

  1. 实现接口的方式可以避免单继承的局限性;同时可以将线程对象与线程任务进行解耦,符合面向对象的特点。
  2. Callable接口是有支持泛型的返回值的;同时可以抛出异常,被外面的操作捕获,获取异常的信息。
  3. 线程池的方式减小了创建和销毁线程的开销。

线程状态

一共有6种状态:新建、阻塞、运行和就绪、等待、超时等待、终止

线程状态

等待通知

等待通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而继续执行后续操作。

相关方法:

方法名 描述
notify() 通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前提是该线程获取到了锁,不释放锁
notifyAll() 通知所有等待在该对象上的线程,不释放锁
wait() 使线程进入WAITING状态,并释放锁
wait(long) 进入超时等待状态,并释放锁

注意:

  1. 使用wait()、notify()、notifyAll()方法之前应该先对调用对象加锁
  2. 调用wait()后,由Running变成了WAITING,并将当前线程放置到了对象的等待队列当中
  3. 调用notify()或notifyAll()后,等待线程依旧不会从wait()返回,只有在获取到锁后才会返回
  4. notify()将一个等待线程变成阻塞状态,而notifyAll()将所有的等待线程变成阻塞状态

UncaughtExceptionHandler

一旦一个线程抛出了未捕获的异常,JVM就会把它杀死,然后异常传递给UncaughtExceptionHandler对象类处理。

ConcurrentModification异常

这是一种快速失败的机制,当使用迭代器进行遍历的时候,迭代器内部维护了一个变量expectedModCount代表期待容器的修改次数,而容器内部维护了一个变量modCount代表容器修改的次数。在每次进行next()操作时,都先会执行以下方法:

final void checkForComodification() {
    
    
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

当modCount != expectedModCount时,表明容器在迭代过程中被修改了,会立即抛出ConcurrentModificationException异常,然后终止遍历。

解决办法:1.使用JUC中的ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet;2.进行正确的同步,保证在迭代的过程中不会对容器进行修改。

Guess you like

Origin blog.csdn.net/zhang_qing_yun/article/details/119154266