Java线程安全与中断机制详解


目录

一、回调

1.this

2.currentthread

二、线程方法

1.中断

1.1interrupt

1.2interrupted

1.3isInterrupted

1.4阻塞方法

1.4.1方法运行

异常抛出原因

1.4.2中断阻塞的处理

1.4.2.1异常终止

1.4.2.2保存中断信息

1.4.2.3中断线程

2.等待

三、线程状态

四、线程安全

1.不安全原因

2.措施

2.1竞争锁阻塞回原子圈

2.1.1效果


一、回调

类在定义时,所有的内容 都是设计给 回调的 ,在**++构造方法++调用时 开始回调**

1.this

因为定义类结构时,实例是还没有创建出来有的,而++回调使用时 是已创建好有++的 ,所以在定义的类结构里面,用this++代指++ 回调时调用所处的实例对象

2.currentthread

线程匿名类的 重写run方法的定义 是在方法当中的、另一个类里面的 ,无法用this代指 线程类的回调实例,所以用静态的Thread.currentthread() ++代指++ 并回调时++获取++ 当前线程的实例


二、线程方法

1.中断

中断通过提前执行完run方法 来正常销毁线程

1.1interrupt

  • 标志位 是判断 线程是否有接受请求 而提前中断结束 的标志

线程实例里的标志位 默认是false实例的interrupt****方法 将标志位设置为true

1.2interrupted

静态的Thread.interrupted****方法 返回当前所处线程实例 此时的标志位 ,如果标志位是true 则还会清除标志位为false

1.3isInterrupted

实例的isInterrupted****方法 返回该线程实例 此时的标志位

1.4阻塞方法

1.4.1方法运行

阻塞方法执行时 会检查着实例的标志位 ,如果为true,则会将中断标志位清除改回false 并抛出InterruptedException异常 直接终止了阻塞方法 抛到阻塞方法的外面

异常抛出原因

线程处于阻塞状态时 被请求中断,阻塞方法与请求中断 是一对++矛盾指令++ ,即阻塞指令要求执行时 又要求停止中断 ,此时阻塞方法就 抛出异常 让程序员二次做出选择

1.4.2中断阻塞的处理

阻塞方法异常抛出后,程序员++如果选择同意 中断阻塞方法++:

1.4.2.1异常终止

选择好 阻塞抛出的异常 销毁方法的终止程度 进行终止

1.4.2.2保存中断信息

在相应的catch块中 调用interrupt 修改该线程实例的标志位回中断状态保存该线程 标志位的中断信息 ,这样**++其它部分代码++ 再检查该线程标志位时 就可以得知 此线程已被请求中断的信息**

1.4.2.3中断线程

保存好中断信息后,再中断执行完该线程(或异常刚好能销毁完)


2.等待

线程实例.join

当前线程去阻塞等待 到此线程执行结束 再执行用等待 ++确定了线程之间执行完毕的顺序++

join(毫秒)设置最大等待的时间


三、线程状态

|---------------|------------------------------|
| NEW | 线程对象对应的系统线程 还未启动的状态 |
| TERMINATED | 线程对象对应的系统线程 已被销毁的状态 |
| RUNNABLE | 线程对象对应的系统线程 处于就绪状态 |
| TIMED_WAITING | 线程对象对应的系统线程 处于固定时间的阻塞状态 |
| WAITING | 线程对象对应的系统线程 处于不固定时间的阻塞状态 |
| BLOCKED | 线程对象对应的系统线程 处于锁竞争的阻塞状态 |


四、线程安全

1.不安全原因

多个线程 同时同地 修改时,各个线程的 各套独立有序的 修改读写的原子圈指令 被无序调度下 互穿插成碎原子指令执行,造成线程不安全

2.措施

2.1竞争锁阻塞回原子圈

多线程 同时同地 修改读写的原子圈指令 是不能被调度 互拆成碎原子指令执行的,持变量竞争锁的原子圈 阻塞其外同变量锁内的指令调度使其最后 该原子圈内的指令 在同变量锁的所有指令中 是串行化调度地执行其它同变量锁内的原子圈指令 都阻塞 无法再同时调度 成互穿插的碎原子

java 复制代码
public class Test {
    private static int count = 0;
    
    public static void main(String[] args) throws InterruptedException {
        Object locker = new Object();//区分是不是持同变量竞争锁
        
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                synchronized (locker) {
                    count++;
                }
            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                synchronized (locker) {
                    count++;
                }
            }
        });
        
        t1.start();
        t2.start();
        t1.join();
        t2.join();

        System.out.println("count: " + count);
    }
}
2.1.1效果

(1)cpu并发执行的程度降低运行效率降低

(2)全部同变量的修改指令 都在++相对它们++ 原子圈内 串行化地执行修改线程安全

相关推荐
RainbowSea10 分钟前
伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 01
vue.js·spring boot·后端
工业互联网专业11 分钟前
基于JavaWeb的兼职发布平台的设计与实现
java·vue.js·spring boot·毕业设计·源码·课程设计·兼职发布平台
楼田莉子21 分钟前
C++学习之继承
开发语言·c++·学习·visual studio
XiaoLeisj35 分钟前
【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
spring boot·阿里云·java-ee·大模型·ai编程·ai 大模型·ai 图片生成
程序员小潘36 分钟前
Dubbo 序列化类检查和自动信任机制
java·dubbo
下页、再停留1 小时前
【PHP】通过IP获取IP所在地理位置(免费API接口)
开发语言·tcp/ip·php
GoGeekBaird1 小时前
大模型应用的五大拦路虎:一位从业者的深度反思与破局指南
后端·github
洛卡卡了1 小时前
面试官问我会不会用 AI,我拿出这个 Ollama + FastGPT 项目给他看
人工智能·后端·docker
ifanatic1 小时前
[每周一更]-(第148期):使用 Go 进行网页抓取:Colly 与 Goquery 的对比与思路
开发语言·后端·golang
Seven971 小时前
剑指offer-17、树的⼦结构
java