码迷,mamicode.com
首页 > 编程语言 > 详细

线程的共享性、互斥性、原子性、可见性、有序性

时间:2017-08-14 10:16:27      阅读:509      评论:0      收藏:0      [点我收藏+]

标签:线程安全   cat   reads   使用   over   output   排他性   exce   rup   

参考链接:http://www.cnblogs.com/paddix/p/5374810.html

一、共享性

多个线程之间共享同一个变量,容易引发多线程安全问题。反之,如果每个数据都只是在自己的线程中使用,只属于某一个线程,那么这个数据则为安全的。

二、互斥性

资源互斥是指只允许一个访问者对其进行访问,具有唯一性和排他性。对于共享数据,如果我们只进行读数据,即使没有互斥性,我们也不需要担心其安全,但如果是写操作,则容易引起线程安全问题。

三、原子性

原子性是指对数据的操作是一个独立的、不可分割的整体。也就是一次操作,是一个连续的不可中断的操作,数据不可以被其他线程修改。i++不是原子性操作

要保证互斥性和原子性,都可以使用synchronized来修饰。

四、可见性

对于共享变量,线程每次读取的是工作内存中共享变量的副本,写入的时候也直接修改工作内存中副本的值,然后在某个时间点上再将工作内存与主内存中的值进行同步。这样导致的问题是,如果线程1对某个变量进行了修改,线程2却有可能看不到线程1对共享变量所做的修改。通过下面这段程序我们可以演示一下不可见的问题。

五、有序性

public class TraditionalThreadSynchronized {

    public static void main(String[] args){
       Outputer out = new Outputer();
       new Thread(new Runnable() {
           @Override
           public void run() {
               try {
                   Thread.sleep(1);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               out.output("zhangsan");
           }
       }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                out.output("lisi");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                out.output("aobama");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                out.output("pulangte");
            }
        }).start();

    }

}

class Outputer{
    public void output(String str){
        for(int i =0;i< str.length();i++){
            System.out.print(str.charAt(i)+" ");
        }
    }
}

输出结果:

z l h a n g s a i n s i p u l a a o b a m a n g t e 

这说明线程不具有有序性

 

线程的共享性、互斥性、原子性、可见性、有序性

标签:线程安全   cat   reads   使用   over   output   排他性   exce   rup   

原文地址:http://www.cnblogs.com/lfdingye/p/7355635.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!