• 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模式

      。。。。

  • 相关阅读:
    MongoDB,无模式文档型数据库简介
    数据说话:怎样的程序员最抢手?
    猛醒:也许我们一生追求的都错了!
    中国风电生产监控平台界面
    如何跟着趋势去赚钱
    2015年最好的员工心态培养 -- 我们需要把简单的事情做到极致
    什么是程序员的核心竞争力?
    第一篇 技术选型
    .net core 读取配置文件
    .net core nlog记录日志
  • 原文地址:https://www.cnblogs.com/yanyouqiang/p/9429688.html
Copyright © 2020-2023  润新知