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

发布于:2025-07-26 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

一、回调

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竞争锁阻塞回原子圈

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

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)全部同变量的修改指令 都在相对它们原子圈内 串行化地执行修改线程安全


网站公告

今日签到

点亮在社区的每一天
去签到