对线程安全的理解

首先,在jvm中有一个main memory,而每个线程都有自己的working memory,一个线程对一个variable进行操作的时候,会先在自己的working memory里面建立一个copy,操作完成之后再写入main memory,如果有多个线程同时操作同一个variable,就可能会出现不可预知的结果,所以线程安全就是为了避免这种情况的发生。在java中,确保线程安全的方法有两种:一种是使用内置锁,一种是使用原子类(java.util.concurrent包下的);

对于内置锁:

可以同步方法,也可以同步代码块,不过建议同步代码块,因为同步方法会锁住整个对象,哪怕这个类中有多个不相关的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。

对于原子类:

锁机制会存在以下问题:

1、在多线程竞争下,加锁、释放锁都会导致比较多的上下文切换(即存储和恢复cpu的状态的过程)和调度延时,引起性能问题;

2、一个线程持有锁会导致其它所有需要此锁的线程挂起;

3、如果一个优先级高的线程等待一个优先级线程低的线程释放锁会导致优先级倒置,引起性能风险;

对于原子类,它所用的机制就是CAS机制(Compare And Swap),CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B,当且仅当预期值A与内存值V相同时,才会将内存值V修改为B,否则什么都不做;

现代cpu提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而compareAndSet()就是用这些代替了锁定,compareAndeSet()是调用本地方法来完成cpu指令的操作。

来看看AutomicInteger的源码:

private volatile int value;//毫无疑问,没有锁的机制下,必须借助volatile保证线程间的数据可见性(volatile的原理是使线程直接读取该变量并且不去缓存它,就确保了线程读取到的变量是同一内存中的,保证一致性)

public final int get(){

return value;

}

来看看++i是怎么实现的:

public final int increamentAndGet(){

for(;;){

int current = get();

int next = current + 1;

if(compareAndSet(current,next))

return next;

}

}

时间: 2024-11-08 19:09:33

对线程安全的理解的相关文章

线程安全和线程不安全理解

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据 ================================================================= 概念: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果

线程的一点理解

一.线程起源 线程的产生基于通过共享公共的内存空间来交换数据可提高协作进程间的通信效率这一思想.线程是程序执行流的最小单元,是进程中的一个实体,一个标准的线程由线程ID.寄存器集合和堆栈组成.是被系统独立调度和分配的基本单位.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行.由于线程之间的相互制约,致使线程在运行中呈现出间断性. 在某一时刻,进程内只有一个称为

linuxc线程信号-pthread_cond_wait理解

pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t*mutex)函数 传入的参数mutex用于保护条件,因为我们在调用pthread_cond_wait时,如果条件不成立我们就进入阻塞,但是进入阻塞这个期间,如果条件变量改变了的话,那我们就漏掉了这个条件.因为这个线程还没有放到等待队列上,所以调用pthread_cond_wait前要先锁互斥量, 即调用pthread_mutex_lock(),pthread_cond_wait在把线程

Java中线程同步的理解 - 其实应该叫做Java线程排队

Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等. 当多个线程同时读写同一份共享资源的时候,可能会引起冲突.这时候,我们需要引入线程"同步"机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团. 同步这个词是从英文synchronize(使同时发生)翻译过来的.我也不明白为什么

我对python线程池的理解

#!/usr/bin/env pythonfrom Queue import Queuefrom threading import Threadimport randomimport time def person(i,q):    while True:  #这个人一直处与可以接活干的状态        q.get()        print "Thread",i,"do_job"        time.sleep(random.randint(1,5))#每

Java并发编程与技术内幕:线程池深入理解

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加以说明,对加深Java线程池的理解有很大的帮助. 首先,讲讲什么是线程池?照笔者的简单理解,其实就是一组线程实时处理休眠状态,等待唤醒执行.那么为什么要有线程池这个东西呢?可以从以下几个方面来考虑:其一.减少在创建和销毁线程上所花的时间以及系统资源的开销 .其二.2将当前任务与主线程隔离,能实现和主

进程与线程的简单理解

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 举个简单例子:我们在使用计算机的时候,这个操作系统中有很多程序,我们可以打开QQ音乐,可以看新闻,可以聊天,可以下载东西.这些都是计算机中的每一个程序,即进程. 而线程是进程的一个部分,比如我们打开word这个进程,这个里面我们可以写,可以修改,可以插图,可以复制,对这一个程序进行的不同操作,我们可以理解为线程. 最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 1. 计算机的

Linux下线程池的理解与简单实现

首先,线程池是什么?顾名思义,就是把一堆开辟好的线程放在一个池子里统一管理,就是一个线程池. 其次,为什么要用线程池,难道来一个请求给它申请一个线程,请求处理完了释放线程不行么?也行,但是如果创建线程和销毁线程的时间比线程处理请求的时间长,而且请求很多的情况下,我们的CPU资源都浪费在了创建和销毁线程上了,所以这种方法的效率比较低,于是,我们可以将若干已经创建完成的线程放在一起统一管理,如果来了一个请求,我们从线程池中取出一个线程来处理,处理完了放回池内等待下一个任务,线程池的好处是避免了繁琐的

线程安全和线程同步的理解

线程安全:线程安全是多线程编程时的计算机程序代码中的一个概念.在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况. 理解:多个线程对同一个是数据进行写操作的时候,执行的结果和预期结果是一致的,就表示线程安全.(如购票系统) 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临