java线程同步

Posted rookie111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程同步相关的知识,希望对你有一定的参考价值。

线程安全的实现方法。

先来说说几个概念:

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线程同步的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程:线程同步详解

java线程-线程同步

线程的线程的同步

java线程同步--同步方法

Java线程:线程的同步与锁

Java线程同步块行为 - 同步与同步()? [复制]