zoukankan      html  css  js  c++  java
  • 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”问题:在程序取值期间另一个线程更改又改回,线程无法判断。

    三、volatile,java提供的最轻量级的同步机制,两个特性:变量对所有线程的可见性,防止指令重排序。

      可见性:每次修改变量的值立马将值写回到主内存,每次取值从主内存中取出该变量的值。

      如何防止指令冲排序:设置一个内存屏障,指令冲排序时不能将内存屏障之后的命令重排序到内存屏障之前的位置。

  • 相关阅读:
    POJ 2236
    HDU 6027
    FZU 2278
    FZU 2282
    python之----------字符编码的原理
    python可变数据类型和不可变数据类型
    python的运算符和while循环
    python之字符串的切片
    python数据类型补充
    python的数据类型
  • 原文地址:https://www.cnblogs.com/rookie111/p/7544760.html
Copyright © 2011-2022 走看看