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

java线程同步

时间:2017-09-18 20:36:42      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:允许   final   mon   问题:   可重入   long   and   资源   默认   

线程安全的实现方法。

先来说说几个概念:

1.同步:多线程并发访问共享数据的时候,保证共享数据在同一时刻只能被一个(一些,使用信号量时)线程使用。

2.临界区:每个进程中访问临界资源的那段代码。

3.临界资源:每次仅允许一个进程访问的资源。

4.信号量:相当于一个计数器,每当一个进程使用一个资源,信号量-1;进程释放一个资源,信号量+1;当信号量为0时,进程无法使用该资源。

5.互斥量:信号量的大小为1的情况下,仅有0和1两个值。

一、互斥->同步,在java中的实现方式有synchronized关键字,java.util.concurrent包下的重入锁ReentrantLock。

  a.synchronized关键字,利用monitorenter和monitorexit这两个字节码指令,这两个字节码指令都需要一个reference类型参数指明锁定和解锁的对象,而且对于同一条线程来说,同          步块是可重入的,在持有锁线程未执行完之前,其他尝试获取锁的线程阻塞。

  b.在功能上很相似,但是在代码写法上,表现为API层面上的互斥锁(lock()和unlock()配合try/finally语句块来完成),并且增加了高级功能:

  ①等待可中断,持有锁的线程长期不释放锁,等待的线程可以选择放弃等待。

  ②可以再构造方法上设置true,实现公平锁,默认非公平锁。

  ③锁可以绑定多个条件,一个ReentrantLock对象可以绑定多个Condition对象。

 注:jdk1.5之前在随着线程数量增多,synchronized性能下降严重,1.6之后性能大约一致。其主要问题是线程阻塞和唤醒所带来的性能问题。

二、非阻塞->同步,采用乐观并发策略,先对共享变量进行操作,如果没有其他线程争用,则操作成功;否则,采用其他补偿措施。

  依赖与硬件:操作和冲突检测两个步骤具有原子性。

  java1.5后操作有sun.misc.unsafe类中的compareAndSwapInt()和compareAndSwapLong()提供,这个只能有Bootstrap ClassLoader加载,可以同过juc中的atomicInt类来间接调用。

  但可能会发生“ABA”问题,但一般不会对程序结果产生影响。

  注:“ABA”问题:在程序取值期间另一个线程更改又改回,线程无法判断。

三、volitile 写累了,待会再写。

java线程同步

标签:允许   final   mon   问题:   可重入   long   and   资源   默认   

原文地址:http://www.cnblogs.com/rookie111/p/7544760.html

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