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

参考链接: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 

这说明线程不具有有序性

时间: 2024-08-27 14:52:32

线程的共享性、互斥性、原子性、可见性、有序性的相关文章

java-多线程深入(二)互斥性和可见性

(一)互斥性 互斥性,即原子性.原子,指最小的物质,具体不可再分性. CPU运算中,对多线程进行时间片分割执行,一个程序块执行时不可分割,即满足互斥性原子性. java中保证互斥性的方法: 1.用sychronized锁住程序块,实行互斥 synchronized (lock) { a++; } 2.用Atomic对变量操作实行互斥 public final static AtomicInteger TEST_INTEGER = new AtomicInteger(1); public stat

线程执行的几种特性(共享性、互斥性、原子性、可见性、有序性)

一.共享性 多个线程共享同一块内存,会引起线程安全问题. 例如变量A同时被Thread1和Thread2访问,可能发生Thread1和Thread2读取的变量A不是同一个值,大多数情况下Thread1和Thread2不会恰好同一个时间读取变量A,而变量A在这段时间差中可能已被修改. 二.互斥性 对同一个资源来讲,同一个时间只能有一个线程访问.解决了多个线程读取的资源不一致的情况,但是写操作要注意覆盖的问题. 三.原子性 对资源的操作一个完整的过程.不会再执行过程停下再做别的操作.所谓原子性指的是

Java线程安全:可见性,原子性,有序性

Java线程安全 可见性,原子性,有序性 Java内存模型(JMM) Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节. 所有的变量都存储在主内存中. 每个线程都有自己独立的工作内存,里面保持该线程使用到的变量副本. 线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中进行读写. 不同线程之间无法直接访问其他线程工作内存的变量,所以线程间变量值的传递需要

可见性、原子性、有序性

一.基本概念 先补充一下概念:Java 内存模型中的可见性.原子性和有序性. 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.也就是一个线程修改的结果.另一个线程马上就能看到.比如:用volatile修饰的变量,就会具有可见性.volatile修饰

分布式系统互斥性与幂等性问题的分析与解决

前言 随着互联网信息技术的飞速发展,数据量不断增大,业务逻辑也日趋复杂,对系统的高并发访问.海量数据处理的场景也越来越多.如何用较低成本实现系统的高可用.易伸缩.可扩展等目标就显得越发重要.为了解决这一系列问题,系统架构也在不断演进.传统的集中式系统已经逐渐无法满足要求,分布式系统被使用在更多的场景中. 分布式系统由独立的服务器通过网络松散耦合组成.在这个系统中每个服务器都是一台独立的主机,服务器之间通过内部网络连接.分布式系统有以下几个特点: 可扩展性:可通过横向水平扩展提高系统的性能和吞吐量

Linux系统编程——线程同步与互斥:读写锁

当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住.但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题. 在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用.为了满足当前能够允许多个读出,但只允许一个写入的需求,线程提供了读写锁来实现.... www.worlduc.com/

多线程同步互斥实例——使用synchronized实现线程通信和互斥

线程互斥概念 线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访问者对资源的访问顺序,即访问是无序的. 实现线程同步互斥的四种方式 临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用 互斥量 (Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似. 事件(Event):通过线程间触发事件实现同步互斥 信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理

Android多线程研究(3)——线程同步和互斥及死锁

为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runnable{ private TestObj testObj = new TestObj(); public static void main(String[] args) { ThreadTest2 tt = new ThreadTest2(); Thread t1 = new Thread(tt,

Java如何实现线程之间的互斥

给出一个题目,有3个线程,我希望线程1向控制台输出3行信息后,线程2向控制台输出6行信息,接下来是线程3输出10行信息到控制台,如此循环10次.在一个线程输出信息的时候,其他线程不能产生干扰. package com.concurrent.condition; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.