Java高并发程序设计

Posted yanyouqiang

tags:

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

一、并行世界

  摩尔定律的失效,2004年秋季,Intel宣布彻底取消4GHz计划,CPU向多核心的发展,顶级计算机科学家唐纳德丶尔文丶克努斯评价:在我看来,这种现象(并发)或多或少是由于硬件设计者已经无计可施导致的,他们将摩尔定律失效的责任推脱给软件开发者。

  1、几个概念

  同步和异步:

  并发与并行:都表示多个任务同时执行,但并发偏重于多个任务交替执行。

  临界区:即共享的数据

  阻塞和非阻塞:

  死锁、饥饿和活锁:死锁为互不让行,饥饿为一直拿不到资源,活锁为一直撞到

  2、并发级别

   由于临界区的存在,多线程之间的并发必须得到控制。根据控制的并发策略,分为阻塞、无饥饿,无障碍,无锁,无等待    5种

  

  3、Java语言相关:JMM(Java内存模型)

  JMM中的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的

    (1)、原子性:操作不可中断

    (2)、可见性:当一个线程修改了某个共享变量的值时,其他线程是否立即知道这个修改。

    (3)、有序性:程序执行时,可能会进行指令的重排来达到优化效果,但在多线程中,由于线程的相互影响,重新排序的线程会打乱其他的线程的执行结果。

 

二、Java并行

  1、进程与线程

  进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配的基本单位。进程是程序的基本执行实体,进程是线程的容器。

  2、线程的状态转换

  Thead类方法:start() 开启线程,run()线程执行实体,sleep() 睡眠线程不会释放资源,yield() 让出CPU,join() 等待线程运行结束,suspend() 挂起,resume() 重启

  Object类方法:wait() 释放对象监听器,线程进入阻塞状态;notify() 随机唤醒一个,notifyAll() 唤醒所有。wait,notify,notifyAll 要在Synchronize同步块中出现,因为其也会出现并发问题

  3、volatile

  volatile关键字告诉虚拟机要主要不要随意变动优化目标指令,对JMM中有序性。但通过volatile是无法保证原子性操作的。

三、Java并发包

  0、并发集合简介

    ConcurrentHashMap:高效并发HashMap,线程安全

    CopyOnWriteArrayList:在读多写少的场合,这个List性能非常好,远远浩宇Vector,都是线程安全

    ConcurrentLinkedQueue:高效并发队列,使用链表实现线程安全

    BlockingQueue:一个JDK内部通过链表、数组等实现的阻塞 接口

    ConcurrentSkipListMap:跳表的实现,这是一个Map,使用跳表的数据结构进行快速查找

  1、BlockingQueue

    此接口是一个线程安全的 存取实例的队列。使用场景

    BlockingQueue通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。

BlockingQueue

 

  2、HashMap、HashTable、ConcurrentHashMap对比

  HashMap 线程不安全,HashTable,ConcurrentHashMap线程安全

  ConcurrentHashMap 采用锁分段技术比HashTable更加高效

四、并行模式与算法

  1、单例模式

    饿汉模式,缺点是不能控制单例生成时间

    

public class Singleton{
  private Singleton();//私有化构造函数,防止new
  private static Singleton instance = new Singleton();//类加载时创建
  public static Singleton getInstance(){
     return instance;
  }    
}

    懒汉模式,缺点是使用synchronized关键字影响多并发性能

public class LazySingleton{
  private LazySingleton();
  private static LazySingleton = null;
  puhblic static synchronized LazySingleton getInstance(){
    if(instance ==null) instance = new LazySingleton();
    return instance;
  }  
}

    综合两种模式的实现,使用内部类

public class StaticSingleton{
  private LazySingleton();
  private static class SingletonHolder{
    private static StaticSingleton instance = new StaticSingleton();
  }
  
  public static StaticSingleton getInstance(){
    return SingletonHolder.instance;
  }
 
}

 

  2、不变模式

  3、生产者消费者

  4、Future模式

  。。。。

以上是关于Java高并发程序设计的主要内容,如果未能解决你的问题,请参考以下文章

java高并发,如何解决,啥方式解决,高并发

JAVA的高并发编程

Java高并发编程实战1,那些年学过的锁

实战Java高并发程序设计 7让线程之间互相帮助--SynchronousQueue的实现

Java高并发程序设计—— java内存模型和线程安全

实战Java高并发程序设计 5让普通变量也享受原子操作