一、并行世界

  摩尔定律的失效,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通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。

  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高并发程序设计的更多相关文章

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

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  2. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

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

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  4. 【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray

    除了提供基本数据类型外,JDK还为我们准备了数组等复合结构.当前可用的原子数组有:AtomicIntegerArray.AtomicLongArray和AtomicReferenceArray,分别表 ...

  5. 【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference AtomicReference无法解决上述问题的根 ...

  6. 【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  7. 《实战java高并发程序设计》源码整理及读书笔记

    日常啰嗦 不要被标题吓到,虽然书籍是<实战java高并发程序设计>,但是这篇文章不会讲高并发.线程安全.锁啊这些比较恼人的知识点,甚至都不会谈相关的技术,只是写一写本人的一点读书感受,顺便 ...

  8. JAVA高并发程序设计笔记

    第二章 Java并行程序基础 1.join()的本质是让调用线程wait()在当前线程的对象上 2.Thread.yiedl()会使当前线程让出CPU 3.volatile保证可见性,无法保证原子性( ...

  9. 《实战Java高并发程序设计》读书笔记

    文章目录 第二章 Java并行程序基础 2.1 线程的基本操作 2.1.1 线程中断 2.1.2 等待(wait)和通知(notify) 2.1.3 等待线程结束(join)和谦让(yield) 2. ...

  10. Java高并发程序设计学习笔记(十一):Jetty分析

    转自:https://blog.csdn.net/dataiyangu/article/details/87894253 new Server()初始化线程池QueuedThreadPoolexecu ...

随机推荐

  1. 容器上使用Docker还是Rocket?为什么不一起用呢?

    在2014年接近尾声时,CoreOS在Docker发布了Rocket,声称Docker的流程模型有着“根本性的缺陷”.虽然CoreOS的创始人Alex Polvi尽量缓和语气,但是他坚持自己的基本观点 ...

  2. postgresql —— 查看索引

    查索引 语句: SELECT tablename, indexname, indexdef FROM pg_indexes WHERE tablename = 'user_tbl' ORDER BY ...

  3. region特征

    一: 查看阈值之后的region特征,可以通过特征检测来看,在工具栏上 region特征分三部分: 1.基础特征: region面积,中心,宽高,左上角及右下角坐标,长半轴短半轴椭圆方向,洞数及其面积 ...

  4. ask confirm shell

    #/bin/bash BASEDIR=$(cd $() && pwd) cd $BASEDIR>/dev/null usage="Usage: $0 -o/--org ...

  5. tomcat实现文件上传下载

    实现下载 修改server.xml修改web.xml   实现上传 实现客户端的上传post请求代码实现 实现服务端的处理   小结         实现下载 实现下载需要  - 修改Tomcat中的 ...

  6. sql server 的模糊查询的用法

     查询所有姓张的同学Select * from student where left(sName,1)=‘张‘   看上去很美,如果改成查询名字中带亮的学生怎么做?换一种做法 like  Select ...

  7. MongoDB 副本集节点添加与删除

    replica set多服务器主从,添加,删除节点,肯定会经常遇到的.下面详细说明一下,添加,删除节点的2种方法. 一,利用rs.reconfig,来添加,删除节点 1,添加节点 查看复制打印 rep ...

  8. Greenplum 执行计划之广播与重分布

    关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的.关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移.数据迁移有广播和重分布两种.在GP中,每一个广播或重分布会产生 ...

  9. 主席树K-th Number

    /*K-th NumberTime Limit: 20000MS Memory Limit: 65536KTotal Submissions: 44535 Accepted: 14779Case Ti ...

  10. 【优化算法】变邻域搜索算法(VNS)求解TSP(附C++详细代码及注释)

    00 前言 上次变邻域搜索的推文发出来以后,看过的小伙伴纷纷叫好.小编大受鼓舞,连夜赶工,总算是完成了手头上的一份关于变邻域搜索算法解TSP问题的代码.今天,就在此给大家双手奉上啦,希望大家能ENJO ...