技术复习-并发

并发的好处

效率高,速度快 突破单cpu瓶颈上限java

并发的坏处

线程安全:对同一个资源同一时刻操做的问题。 上下文切换安全

  • Synchronized java中最基本的锁,能够锁代码块,方法,静态方法,非公平锁。 synchronized(对象),这个时候锁住的是对象 synchronized(this),锁当前对象, synchronized method,锁住的是当前对象

synchronized(Object.class) 锁住的是Class。 synchronized static method,锁住的是当前Class。并发

synchronized在进入代码块的时候分别造成monitorenter,monitorexit指令,在执行monitorenter指令的时候尝试获取锁对象,若是锁对象没有被锁或者是被当前线程锁住,则锁的计数器+1,monitorexit指令会让锁的计数器-1,减到0则释放对象的锁。由此synchronized是可重入的,不会出现本身把本身锁死.工具

  • ReentrantLock

支持公平锁/非公平锁 new ReentrantLock 支持获取锁中断机制 tryLock 支持Condition,能够更好的完成同步协调优化

  • ReentrantReadWriteLock 读写锁
    ReentrantReadWriteLock.readLock.lock() ReentrantReadWriteLock.readLock.unlock()

ReentrantReadWriteLock.writeLock.lock() ReentrantReadWriteLock.writeLock.unlock()ui

线程同步工具

  • Condition
    必需要锁住 condition.await() condition.signal() condition.signalAll()

Object.wait() Object.notify() Object.notifyAll()this

  • Semaphore semaphore.aquire() semaphore.release()线程

  • CountDownLatch countDownLatch.countDown(); countDownLatch.await();对象

Semaphore能够恢复。 CountDownLatch一次性的不能够恢复排序

  • CyclicBarrier cyclicBarrier.awai();

  • Exchanger 交换两个线程数据 exchanger.exchange(data1);

  • BlockingQueue

  • volatile 1.可见性. 内存分为主存,工做内存。线程工做的时候会把,从主存读取,同步到工做内存,更新到工做内存,某个时刻再同步到主存。volatile会保证数据更新当即同步主存,并将其余线程的工做内存中的值设为无效。使得其余线程是当即可见的变动值。

2.禁止指令重排序。 Object obj = new Object();

  1. 分配内存空间
  2. 初始化对象
  3. 内存地址赋值

JVM会自动对字节码指令进行重排序优化,可能执行顺序是123,132,312被修饰的变量会禁止指令重排序。

相关文章
相关标签/搜索