一、并行世界

  摩尔定律的失效,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. CentOS阿里仓库停止openstack mitaka源服务报错------“No package centos-release-openstack-mitaka available.”

    之前学习了一个月的openstack的mitaka版本,部署完后放置一段时间,最近准备正式部署突然发现“No package centos-release-openstack-mitaka avail ...

  2. Linux网络编程综合运用之MiniFtp实现(八)

    上节中实现了"USER"和"PASS"命令,如下: 事实上FTP是有很多命令组成的,如果就采用上面的这种方法来实现的话,就会有很多if...else if语句, ...

  3. 单链表(python)

    # -*- coding: utf-8 -*- class Node(object): def __init__(self, value=None, next=None): # 这里我们 root 节 ...

  4. pypython解构

    *******重点 解构:把线性结构的元素解开,并按顺序的赋给其他变量 左边接纳的要与右边解开的个数一致. lst = [3,5] first,second = lst print(first,sec ...

  5. 本地python环境检查,插件检查及插件安装

    电脑windows键+r  输入cmd 在python命令模式下 pip list  --可以查看已安装的插件情况 或者用 pip freeze 也可以 卸载插件:pip uninstall *** ...

  6. 19 Jquery 属性

    从 jQuery 1.6 开始, .prop()方法 方法返回 property 的值,而 .attr() 方法返回 attributes 的值. 例如, selectedIndex, tagName ...

  7. eclipse跳转到exitCurrentThread

    1.在使用Eclipse时,用Debug模式运行springboot项目,结果总是在项目快启动成功的时候,跳转到exitCurrentException这个地方 2.方法:Eclipse->[P ...

  8. 服务如何配置JVM

    为了使JVM的资源利用更合理,往往需要手动设置JVM的初始值.下面将详细介绍不同环境下的JVM配置. 1.如果是应用程序,则:java -Xms800m -Xmx800m 你的类名 java -Xms ...

  9. 解决appium自带的Chromedriver版本和设备Android System Webview版本不一致的问题

    报错信息 selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred w ...

  10. 有关求第n位xxx 的算法的问题

    最近,博客园上看到有关求 斐波那契数列的第n位是什么的问题.什么是 斐波那契数列? 我自己也忘记了,后来百度了下.http://baike.baidu.com/view/816.htm?fr=alad ...