美文网首页
Java面试题-线程篇-(3)你是如何理解线程安全的

Java面试题-线程篇-(3)你是如何理解线程安全的

作者: wyn_做自己 | 来源:发表于2023-08-30 22:11 被阅读0次

《Java并发编程实战》一书中,它是这么描述的:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。
简单的说,线程安全是指程序在并发环境运行时,多线程之间能够正确的处理共享变量,程序总是表现出正确完成的行为。注意关键词:并发环境、多线程、共享变量、正确完成。这里所谓的正确完成,就是要保证并发的三大特性:原子性、可见性、有序性

下面举一个例子:

单线程情况下:

public class OneThreadDemo {
    public static void main(String[] args) {
        int i = 0;
        for (int j = 0; j < 20000; j++) {
            i++;
        }
        System.out.println("最终结果: " + i);
    }
}

最终执行结果始终为20000

image.png
多线程不考虑线程安全情况下:
public class ManyThreadDemo {
    private static int i = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(new Incrementer());
        Thread thread2 = new Thread(new Incrementer());

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("最终结果: " + i);
    }

    private static class Incrementer implements Runnable {
        @Override
        public void run() {
            for (int j = 0; j < 10000; j++) {
                    i++;
            }
        }
    }
}

最终的结果就不确定了:

image.png
image.png
多线程考虑线程安全情况下:
public class ManyThreadSecureDemo {
    private static int i = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(new Incrementer());
        Thread thread2 = new Thread(new Incrementer());

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("最终结果: " + i);
    }

    private static class Incrementer implements Runnable {
        @Override
        public void run() {
            for (int j = 0; j < 1000; j++) {
                synchronized (ManyThreadSecureDemo.class) {
                    i++;
                }
            }
        }
    }
}

最终执行的结果始终为:2000


image.png

从上面的代码示例不难得出:在多线程环境中,多个线程在同一时刻对同一份资源进行写操作时,在加锁的时候结果符合预期,这就是线程安全的,但没有加锁的时候不符合预期的结果这就是非线程安全的。

其实说白就是:单个线程下程序的运行结果和多线程下程序运行的结果始终保持一致,这就是线程安全的。

相关文章

  • JAVA线程面试题书目录

    JAVA线程面试题之1) 什么是线程? JAVA线程面试题之2) 线程和进程有什么区别? JAVA线程面试题之3)...

  • java线程面试题大全

    java线程面试题大全1、15个Java线程并发面试题和答案2、15个高级Java多线程面试题及回答3、GC线程是...

  • 58(5.3)

    53分钟。 线程和进程区别 Java的线程安全 什么是线程安全,如何保障。哪些变量是线程安全。 Java IO 分...

  • 多线程面试题(这个是复制别人的,感觉很好)

    50道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试。 1) 什么是线程? 线程...

  • 2018-02-01

    50道java线程面试题 50道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试。...

  • 并发编程有关知识点(五)

    Java 内存模型 java线程安全总结 深入理解java内存模型系列文章 线程状态: 一张图让你看懂JAVA线程...

  • 50道Java线程面试题

    50道Java线程面试题下面是Java线程相关的热门面试题,你可以用它来好好准备面试。 什么是线程?线程是操作系统...

  • java线程面试题_2019java面试题库

    1、15个Java线程并发面试题和答案2、15个高级Java多线程面试题及回答3、GC线程是否为守护线程?4、Ha...

  • 锁机制

    一、说说线程安全问题,什么是线程安全,如何保证线程安全 http://www.jasongj.com/java/t...

  • Java问题详解

    1.什么是线程安全? 在《深入理解Java虚拟机(第2版)》中,将线程安全分为了不可变、绝对线程安全、相对线程安全...

网友评论

      本文标题:Java面试题-线程篇-(3)你是如何理解线程安全的

      本文链接:https://www.haomeiwen.com/subject/hmvamdtx.html