美文网首页
线程安全与非线程安全

线程安全与非线程安全

作者: 三年级一班亚索 | 来源:发表于2018-11-07 17:51 被阅读2次

概念

一个线程中的实例变量针对其他线程有共享与不共享之分,这个在多线程之间交互时是很重要的一个技术点。
数据不共享的情况

例子

我们先来看二段程序

public class MyThread extends Thread {

    private int count = 5;


    @Override
    public void run() {
        super.run();

        count --;
        System.out.println(this.currentThread().getName() + count);

    }
}
public class Run {
    public static void main(String[] args) {
        MyThread k = new MyThread();
        Thread a = new Thread(k, "a");
        Thread b = new Thread(k, "a");
        Thread c = new Thread(k, "a");
        Thread d = new Thread(k, "a");
        a.start();
        b.start();
        c.start();
        d.start();
    }
}

在这个程序中的输出结果是杂乱的,如下图所示



因为我们无法确保线程运行的原子性,怎么说呢,就是指第一段代码中的

count --;
System.out.println(this.currentThread().getName() + count);

count是一个共享的变量,所以第一行语句修改了count以后,再执行第二行语言时,count可能在这个时间间隔中又被其他线程给改了,
所以我们需要在run()前面加入synchronized来确保程序的原子性。当多个线程执行run()方法时,先判断run方法有没有被 上锁,如果上锁,说明有其他的线程正在执行,必须等其他线程调用结束后才可以执行run方法。而这段代码也叫临界区。synchronized这个单词的意思就是同步,一个接着一个来。

public class MyThread extends Thread {

    private int count = 5;


    @Override
    synchronized public void run() {
        super.run();

        count --;
        System.out.println(this.currentThread().getName() + count);

    }
}

所谓非线程安全主要是指多个线程对同一个对象的同一个实例变量进行操作时会出现值被更改,值不同步的情况,进而影响程序 的执行流程。

相关文章

  • 2.1synchronized同步方法

    “线程安全”与“非线程安全”相关的技术点,它们是学习多线程技术时一定会遇到的经典问题。“非线程安全”其实会在多个线...

  • 线程安全与非线程安全

    线程安全 多线程访问时,对数据进行加锁保护,防止数据出现不一致或者数据污染情况。即:当一个线程要访问某类中的数据时...

  • 线程安全与非线程安全

    概念 一个线程中的实例变量针对其他线程有共享与不共享之分,这个在多线程之间交互时是很重要的一个技术点。数据不共享的...

  • 2019-03-07线程安全和非线程安全

    [JAVA中的线程安全与非线程安全] 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进...

  • String、StringBuffer、StringBuilde

    String 是字符串常量(线程安全);StringBuffer(线程安全), StringBuilder(非线程...

  • HashMap学习

    概述 线程非安全,并且允许key与value都为null值,HashTable与之相反,为线程安全,key与val...

  • ConcurrentHashMap浅析

    简述 ConcurrentHashMap是针对HashMap非线程安全和HashTable低性能线程安全。它是线程...

  • JAVA 线程安全

    线程安全定义 一个类在可以被多个线程安全调用时就是线程安全的。 线程安全分类 线程安全不是一个非真即假的命题,可以...

  • 单例设计模式

    饿汉式,线程安全 但效率比较低 饱汉式,非线程安全 饱汉式,线程安全简单实现 线程安全 并且效率高 单例模式最优...

  • iOS多线程—各种线程锁的简单介绍

    线程安全是怎么产生的 比如线程内操作了一个线程外的非线程安全变量,就要考虑线程的安全和同步。 - (void)ge...

网友评论

      本文标题:线程安全与非线程安全

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