我对线程安全的理解

Wiki的解释如下

Thread safety is a computer programming concept applicable to multi-threaded code. Thread-safe code only manipulates shared data structures in a manner that ensures that all threads behave properly and fulfil their design specifications without unintended interaction. There are various strategies for making thread-safe data structures

关键词就在这几个加粗的字体,是针对多线程的场合的共享数据,为了防止出现不确定的结果(多次执行结果的不确定性)。

举例:下面代码如果不加synchronized的话如果两个线程通知去i++,有可能就会出现覆盖的情况,而不是另一个线程去等待第一个完成后再去 i++

class Counter {
    private static int i = 0;

    public synchronized void inc() {
        i++;
    }
}

至于HashTable是线程安全,而HashMap不是。StringBuffer是线程安全的,而StringBuilder不是。无非也是这个道理,自我实现线程安全也就是保证同一时间只有一个线程来访问我,这样就会避免覆盖的情况。如果阅读过StringBuffer的同学都会发现,它的所有方法前面都加了synchronized,如此而已。

当然,除了用这样的方法避免之外,另外的思路就是避免线程共享变量,比如使用每次class都新重新构造,使用局部变量,只允许初始化一次

时间: 2024-11-09 02:13:51

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

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

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

线程的一点理解

一.线程起源 线程的产生基于通过共享公共的内存空间来交换数据可提高协作进程间的通信效率这一思想.线程是程序执行流的最小单元,是进程中的一个实体,一个标准的线程由线程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资源都浪费在了创建和销毁线程上了,所以这种方法的效率比较低,于是,我们可以将若干已经创建完成的线程放在一起统一管理,如果来了一个请求,我们从线程池中取出一个线程来处理,处理完了放回池内等待下一个任务,线程池的好处是避免了繁琐的

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

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

对线程安全的理解

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