当前位置: > 财经>正文

线程不安全的原因及其解决 外汇美债不安全的原因有哪些

2023-07-20 02:57:09 互联网 未知 财经

线程不安全的原因及其解决

一、什么是线程不安全和线程安全

定义:线程不安全:多线程并发执行某个代码时,产生了逻辑上的错误,结果和预期值不相同线程安全是指多线程执行时没有产生逻辑错误,结果和预期值相同

二、线程不安全产生的原因

线程是抢占执行的。有的操作不是原子的。当 cpu 执行一个线程过程时,调度器可能调走CPU,去执行另一个线程,此线程的操作可能还没有结束;(通过锁来解决)多个线程尝试修改同一个变量(一对一修改、多对一读取、多对不同变量修改,是安全的)内存可变性指令重排序:java的编译器在编译代码时,会针对指令进行优化,调整指令的先后顺序,保证原有逻辑不变的情况下,来提高程序的运行效率。

三、怎样解决线程不安全

加锁

锁的特点:互斥的,同一时刻只有一个线程可以 获取到锁,其他线程如果尝试获取锁,就会发生阻塞等待,等到刚那个线程 释放锁 ,此时剩下的线程再重新竞争锁

基本操作:加锁,解锁(释放锁)

使用锁 —— 关键字 synchronized 加到普通方法前:表示锁 this;加到静态方法前:表示锁当前类的类对象(类对象就是 JVM运行时,将 .class 文件加载到内存中获取到的(类加载));对象名 . getClass() --》 获取类对象加到某个代码之前,显示指定给某个对象加锁; 如果两个对象有两把锁,各自锁各自的,就不会涉及冲突 / 互斥

但是,一旦锁里边的内容出现问题,就可能出现死锁,其他程序就只能一直等待,此时就得重启

四、相关代码

import java.util.Scanner;public class ThreadDemo11 { public static void main(String[] args) { Object locker1 = new Object(); Object locker2 = new Object(); Thread t1 = new Thread() { @Override public void run() { synchronized (locker1.getClass()) { System.out.println("请输入一个整数:"); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); System.out.println("n = " + n); } } }; t1.start(); Thread t2 = new Thread() { @Override public void run() { synchronized (locker2.getClass()) { System.out.println("t2 获取到锁了"); } } }; t2.start(); }}

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。