美文网首页
什么是线程安全性?

什么是线程安全性?

作者: 一团捞面 | 来源:发表于2018-09-09 22:46 被阅读18次

1. 定义

线程安全性最重要的概念就是正确性,而正确性的意思就是这个类表现的行为要和我们的期望的行为是一致的。

这个定义可能还会有些模糊,以下用一个例子来说明。

2. 例子

public class ThreadSafeDemo {
    
    public int count = 0;
    
    public void increaseCount() {
        count++;
    }
    
    static class TaskThread extends Thread {
        
        ThreadSafeDemo threadSafeDemo;
        
        public TaskThread(ThreadSafeDemo threadSafeDemo) {
            this.threadSafeDemo = threadSafeDemo;
        }
        
        @Override
        public void run() {
            for(int i = 0; i < 1000; i++) {
                threadSafeDemo.increaseCount();
            }
        }
        
    }
    
    public static void main(String[] args) throws InterruptedException {
        int num = 10;
        ThreadSafeDemo threadsafe = new ThreadSafeDemo();
        Thread[] threads = new Thread[num];
        
        for(int i = 0; i < num; i++) {
            threads[i] = new TaskThread(threadsafe);
            threads[i].start();
        }
        
        for(int i = 0; i < num; i++) {
            // 当线程数组的所有线程的任务执行完之后,主线程才会继续执行
            threads[i].join();
        }
        
        System.out.println(threadsafe.count);
    }
    

}

首先分析下我们期望这个类的行为是什么?从代码就可以看出,这里希望这个类的 count 变量可以从 0 变成 10000。

所以这里启动了 10 个线程,每个线程都会循环调用 1000 次 increaseCount(),这个方法就是调用 count++。

启动所有线程之后会循环调用每个线程的 join() 方法,目的就是为了阻塞主线程直到所有线程都执行完成之后才继续调用主线程的打印方法。

运行代码可能会出现如下结果:

9431

这个结果和我们预期代码输出的结果并不一致,这就代表这个类并不具有线程安全性了。

3. 什么时候才会讨论线程安全性?

要讨论线程安全性,必须满足两个前提条件:

  • 在多线程的环境下
  • 多个线程中对共享变量进行修改

如果多个线程根本没有共享变量或者没有对这个共享变量进行修改,这时候这个类肯定是线程安全的,所以根本没必要讨论这个类是否线程安全。

相关文章

  • Java并发编程 线程安全性

    什么是线程安全性 线程安全性:当多个线程访问某个类时,不管运行时采用何种调度方式或者这些线程将被如何交替执行,并且...

  • java并发编程实战2~3

    2 线程安全性 2.1 什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何...

  • 什么是线程安全性?

    1. 定义 线程安全性最重要的概念就是正确性,而正确性的意思就是这个类表现的行为要和我们的期望的行为是一致的。 这...

  • 《Java并发编程实战》文摘

    《Java并发编程实战》文摘,有兴趣的朋友可以买本纸质书仔细研究下。 一 线程安全性 1.1 什么是线程安全性 当...

  • 第二章-线程安全性

    线程安全核心: 共享: 可变: 同步: 如何修复多个线程访问可变状态是发生的错误: 2.1 什么是线程安全性 无状...

  • ThreadLocal实现原理揭秘

    ThreadLocal是什么?对java多线程有了解的人都清楚,在多个线程程序中,会出现线程安全性问题,即多线程是...

  • 理解《Java并发编程实战》时需要回答的问题

    什么是并发性?什么是线程安全性? 什么是基本并发构建块?如何使用它来构建线程安全类? 构建线程安全类的规则清单有哪...

  • 第二章——线程安全性

    2.1 什么是线程安全性 无状态对象一定是线程安全的 上面的 StatelessFactorizer 是无状态的,...

  • 02.线程安全性问题

    [TOC] 安全性问题概述 什么是安全性问题 多线程情况下的安全问题,是指数据的一致性问题,在多线程环境下,多个线...

  • HashMap 和 ConcurrentHashMap 的区别

    线程安全性不同, HashMap 是线程不安全的, ConcurrentHashMap 是线程安全的. Concu...

网友评论

      本文标题:什么是线程安全性?

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