Thread学习
文章平均质量分 78
个人针对Thread学习中得笔记记录
嘟嘟嘟嘟嘟嘟222
这个作者很懒,什么都没留下…
展开
-
深入理解volatile关键字
原子性是指在一次或者多次操作中,要么所有操作都执行成功,要么都执行不成功。可见性当一个线程对共享变量进行修改后,另外的线程可以立即看到修改后的值。有序性指代码在执行过程中的先后顺序,由于java编译器寄运行期的优化会导致执行顺序和代码顺序不一致。Java内存模型(JMM)如何保证原子性,可见性,有序性JMM只保证基本的读取和赋值的原子性操作其他都不保证,x=10是原子性的,x++,y=x之类的都是非原子性的。java提供如下方式保证原子性:使用synchronized关键字。使用java原创 2020-07-19 17:45:57 · 183 阅读 · 0 评论 -
JVM加载器的双亲委托机制
双亲委托机制介绍双亲委托机制有时也称父委托机制,当一个类调用loadClass之后并不会直接将其加载,而是先交给当前类加载器的父加载器尝试加载,知道最顶层的父加载器,然后再一次向下进行加载。loadClass方法源码 public Class<?> loadClass(String name) throws ClassNotFoundException { return loadClass(name, false); } protected Class原创 2020-07-19 15:30:30 · 134 阅读 · 0 评论 -
JVM类加载器与自定义类加载器
JVM内置的三大类加载器JVM提供了三大类加载器,不同的加载器负责将不同的类加载到JVM内存中,并且它们之间严格遵守父委托机制。根类加载器根加载器又称Bootstrap类加载器,是最顶层的加载器由C++编写,主要负责虚拟机核心库的加载,比如java.lang包都是根加载加载的,根加载器的加载路径可以通过“sun.boot.class.path”获取。 public static void main(String[] args) { System.out.println(System.getPro原创 2020-07-18 18:34:16 · 119 阅读 · 0 评论 -
类的加载过程
类的主动使用和被动使用原创 2020-07-18 14:43:05 · 98 阅读 · 0 评论 -
自定义的线程池
自定义线程是为了练习,对前面的学习进行汇总,JDK的ExecutorService线程池的实现已经很够用了。一个完整线程池具备的要素任务队列:用于缓存提交的任务。线程数量管理功能:线程池必须能够很好的管理自己的线程数量,线程自动扩充时的最大线程数量,空闲时也要维护的核心线程数量。任务拒绝策略:线程数量已达上限并且任务队列已满,则需要有相应的拒绝策略来通知任务提交者。线程工厂:主要用于个性定制线程,比如设置线程为守护线程,以及设置线程名称等。QueueSize:任务队列主要存放提交的Runnab原创 2020-07-17 22:30:22 · 143 阅读 · 0 评论 -
捕获线程异常与Hook线程
捕获线程运行时异常APIvoid setUncaughtExceptionHandler(UncaughtExceptionHandler eh)为某个线程指定uncaughtExceptionHandlerstatic void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh)设置全局的uncaughtExceptionHandlerstatic UncaughtExceptionHandler getDefaultU原创 2020-07-16 16:14:39 · 194 阅读 · 0 评论 -
Thread Group介绍
创建ThreadGroupThreadGroup(String name);ThreadGroup(ThreadGroup parent, String name);创建线程时没有指定ThreadGroup则属于父线程的ThreadGroup。 public ThreadGroup(String name) { this(Thread.currentThread().getThreadGroup(), name); } public ThreadGroup(Threa原创 2020-07-16 11:38:40 · 409 阅读 · 0 评论 -
线程间的通信(二)
多线程间通信notify每次只唤醒一个线程,jvm的wait set 唤醒规则是先进先出的方式弹出。notifyAll()唤醒wait set里全部的阻塞线程,被唤醒的线程同样需要继续争抢motior锁。wait set 线程休息室,线程调用某个对象的wait方法后就会进入到与对象关联的wait set中,并且释放monitor所有权。注意: 对于临界值的判断使用while而不是if,因为while时循环判断,在线程被唤醒并获取到monitor所有权时会再判断一次,保证临界值的一致性,而if只会判断原创 2020-07-16 10:37:50 · 86 阅读 · 0 评论 -
线程间的通信(一)
同步阻塞客户端提交Event请求到服务器,服务器收到请求后开启线程处理,处理完后再将结果集返回给客户端。同步Event提交,客户端等待时间长(提交时长+创建Thread时长+业务处理时长+返回结果时长)会陷入阻塞,导致二次提交Event耗时过长。限制系统同时受理业务数量,整体吞吐量不高。频繁创建销毁线程,增加系统额外开销。大量业务处理线程阻塞会导致CPU上下文切换频繁,降低系统性能。异步非阻塞客户端提交Event请求到服务器后会得到一个工单并且立即返回,Event则会被放置在队列中,服务器的原创 2020-07-15 19:11:31 · 123 阅读 · 0 评论 -
Thread API(二)
interrupt线程在调用可中断方法进入阻塞时,可由其他线程调用interrupt()进行打断,打断的线程并不是生命周期结束,而是打断当前的阻塞状态。线程调用可中断方法进入阻塞状态下被打断会抛出InterruptedException异常,interrupt标识会被清除。 public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchron原创 2020-07-15 09:59:16 · 97 阅读 · 0 评论 -
Thread API(一)
sleep 方法介绍sleep(long millis);sleep(long millis, int nanos);休眠时线程不会放弃monitor锁的所有权,只导致当前线程进入指定时间休眠,没有CPU时间片的消耗,另一个线程调用interrupt会捕捉到中断信号。public static native void sleep(long millis) throws InterruptedException; public static void sleep(long millis, int原创 2020-07-14 13:57:07 · 198 阅读 · 0 评论 -
Thread synchronized详解
synchronized介绍synchronized提供一种锁机制,确保共享变量的互斥访问,从而防止数据的不一致问题。synchronized关键字包括 monitor enter 和 monitor exit两个JVM指令,保证在任何时候任何线程执行到monitor enter成功之前都必须从主内存中获取数据,而不是缓存中获取,在monitor exit运行成功后,共享变量被更新后的值必须刷入主内存。synchronized指令严格遵守java happens-before原则,一个monitor原创 2020-07-15 12:13:30 · 680 阅读 · 0 评论 -
JVM内存结构
程序计数器用于存放当前线程接下来要执行的字节码命令、分支、异常处理信息等。每个线程拥有独立的程序计数器,因此JVM将此块区域设计成线程私有的。java虚拟机栈是线程私有的,生命周期与线程相同。在线程中方法执行的时候会创建一个名为栈帧的数据结构,用于存放局部变量、操作栈、动态链接、方法出口等信息,方法的调用也对应着栈帧的压栈和弹栈过程。本地方法栈JVM为本地方法所划分的内存区域便是本地方法栈,这块内存区域自由度高,由不同JVM厂商实现,同样也是线程私有的。堆内存是JVM最大的一块内存区域,被所.原创 2020-07-12 21:59:54 · 839 阅读 · 0 评论 -
深入理解Thread构造函数
线程的默认命名Thread()Thread(Runnable target)Thread(ThreadGroup group, Runnable target)如果没有显式的制定线程的名称,那么线程会以“Thread-”作为前缀与一个自增数字进行组合,自增数字在整个JVM进程中将不断自增。 public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } public Thread(Runnab原创 2020-07-12 22:12:12 · 276 阅读 · 0 评论 -
线程生命周期
1. new 新建状态 使用new创建Thread对象时,线程并不处于执行状态,因为没有调用start()方法启动线程。 通过调用start()方法让线程进入runnable状态。2. runnable 可运行状态 进入runnable 状态的线程不会立即执行,只是具备了执行的资格,并没有真正执行起来,实在等待CPU的调度。3 running 运行状态 表示线程正在执行中,状态可以发生如下转换: 1. 直接进入terminated状态,4. blocked 阻塞状态5. termina原创 2020-07-12 11:17:44 · 129 阅读 · 0 评论