线程的共享性互斥性原子性可见性有序性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程的共享性互斥性原子性可见性有序性相关的知识,希望对你有一定的参考价值。
参考链接: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
这说明线程不具有有序性
以上是关于线程的共享性互斥性原子性可见性有序性的主要内容,如果未能解决你的问题,请参考以下文章