zoukankan      html  css  js  c++  java
  • 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模式

      。。。。

  • 相关阅读:
    PowerDesigner最基础的使用方法入门学习
    使用vertx共享数据
    VMware中虚拟机与主机不能ping通解决办法
    Win10系统的SurfacePro4无法修改启动顺序怎么办
    Win10系统的SurfacePro4如何重装系统-4 如何再次备份和还原系统
    Win10系统的SurfacePro4的启动菜单太多怎么管理,UEFI的启动菜单如何编辑
    Win10系统的SurfacePro4如何重装系统-3 重装完成之后的系统优化
    Win10系统的SurfacePro4如何重装系统-2 重装WIN10系统
    Win10系统的SurfacePro4如何重装系统-1 SurfacePro专用的PE
    Win10系统的DELL平板如何重装WIN10系统
  • 原文地址:https://www.cnblogs.com/yanyouqiang/p/9429688.html
Copyright © 2011-2022 走看看