Java编程思想中关于并发的总结
知识点摘抄
1、用并发解决的问题大体上可以分为“速度”和“设计可管理性”两种。
2、并发通常是提高运行在单处理器上的程序的性能。
这听起来有些违背直觉。如果你仔细考虑一下就会发现,在单处理器上运行的并发程序开销确实应该比该程序的所有部分都顺序执行的开销大,因为其中增加了所谓上下文切换的代价(从一个任务切换到另一个任务)。
使这个问题变得有些不同的是阻塞。如果程序中的某个任务因为该线程控制之外的某些条件(通常是I/O)而导致不能继续执行,那么我们就说这个任务或线程阻塞了。如果没有并发,则整个程序都将停止下来,直至外部条件发生变化。但是如果使用并发来编写
程序,那么当一个任务阻塞时,程序中的其他任务还能继续执行,因此这个程序可以保持继续向前执行。事实上,从性能的角度看,如果没有任务会阻塞,那么在单处理器机器上使用并发就没有任何意义。
3、实现并发最直接的方式是在操作系统级别使用进程。进程是运行在它自己的地址空间内的自包容的程序。
4、操作系统通常会将进程互相隔离开,因此他们不会彼此干涉,这使得用进程编程相对容易一些。与此相反的是,像Java所使用的这种并发系统会共享诸如内存和I/O这样的资源,因此编写多线程程序最基本的困难在于在协调不同线程驱动的任务之间的对这些资
源的使用,以使得这些资源不会同时被多个任务访问。
5、Java的线程机制是抢占式的,这表示调度机制会周期性的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的的时间去驱动它的任务。
6、一个线程就是在进程中的一个单一的顺序控制流,因此,单个进程可以拥有多个并发执行的任务。
知识点扩展
发布:一个对象是使它能够被当前范围之外的代码所引用:
常见形式:将对象的的引用存储到公共静态域;非私有方法中返回引用;发布内部类实例,包含引用。
逃逸:在对象尚未准备好时就将其发布。
不要让this引用在构造函数中逸出。例,在构造函数中启动线程,线程会包含对象的引用。
同步容器:对容器的所有状态进行穿行访问,Vector、Hashtable,Cllections.synchronizedMap|List
并发容器:ConcurrentHashMap,CopyOnWriteArrayList,ConcurrentLinkedQueue、BlockingQueue
list 随机访问特性的优势。
Blocking 增加了可阻塞的get set操作
ConcurrentHashMap:分离锁,为并发访问带来的高的吞吐量,同时几乎没有损失单个线程的访问性能。返回弱一致性的迭代器。
迭代器的弱一致性,在迭代器生成以后会检测容器的修改变化。
并发容器 size(), isEmpty() 弱化,返回近似结果。
CopyOnWriteArrayList:每次修改容器时复制,适用迭代需求大于修改需求情况。
生产者消费者模式,运用有界阻塞队列解耦生产者和消费者的代码。
Executor任务执行框架,实现了生产者消费者模式。
SynchronousQueue:put等待消费者可用,take等待生产者可用,适用于消费者充足的情景。
以上就是本次介绍的全部知识点内容,感谢大家的学习和对我们的支持。
相关推荐
-
了解JAVA并发工具常用设计套路
前言 在学习JAVA并发工具时,分析JUC下的源码,发现有三个利器:状态.队列.CAS. 状态 一般是state属性,如AQS源码中的状态,是整个工具的核心,一般操作的执行都要看当前状态是什么, 由于状态是多线程共享的,所以都是volatile修饰,保证线程直接内存可见. /** * AbstractQueuedSynchronizer中的状态 */ private volatile int state; /** * Status field, taking on only the values
-
Java并发框架:Executor API详解
介绍 随着当今处理器中可用的核心数量的增加, 随着对实现更高吞吐量的需求的不断增长,多线程 API 变得非常流行. Java 提供了自己的多线程框架,称为 Executor 框架. 1. Executor 框架是什么? Executor 框架包含一组用于有效管理工作线程的组件.Executor API 通过 Executors 将任务的执行与要执行的实际任务解耦. 这是 生产者-消费者 模式的一种实现. java.util.concurrent.Executors 提供了用于创建工作线程的线程池
-
Java同步容器和并发容器详解
同步容器 在 Java 中,同步容器主要包括 2 类: Vector.Stack.HashTableCollections 类中提供的静态工厂方法创建的类(由 Collections.synchronizedXxxx 等方法) Collections类中提供的静态工厂方法创建的类 Vector 实现了 List 接口,Vector 实际上就是一个数组,和 ArrayList 类似,但是Vector 中的方法都是 synchronized 方法,即进行了同步措施. Stack 也是一个同步容器,它
-
java并发分段锁实践代码
以下是代码: package cn.study.concurrency.ch11; /** * 锁分段 * @author xiaof * */ public class StripedMap { //同步策略:就是对数组进行分段上锁,n个节点用n%LOCKS锁保护 private static final int N_LOCKS = 16; private final Node[] buckets; private final Object[] locks; private static cl
-
Java并发中线程封闭知识点详解
在这篇文章中,我们将探讨线程封闭是什么意思,以及我们如何实现它. 所以,让我们直接开始吧. 线程封闭基础知识点 实现好的并发是一件困难的事情,所以很多时候我们都想躲避并发.避免并发最简单的方法就是线程封闭.什么是线程封闭呢? 就是把对象封装到一个线程里,只有这一个线程能看到此对象.那么这个对象就算不是线程安全的也不会出现任何安全问题.实现线程封闭有哪些方法呢? 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现.也是最糟糕的一种线程封闭.所以我们直接把他忽略掉
-
阿里的一道Java并发面试题详解
题目 我个人一直认为: 网络.并发相关的知识,相对其他一些编程知识点更难一些,主要是不好调试并且涉及内容太多 ! 所以今天就取一篇并发相关的内容分享下,我相信大家认真看完会有收获的. 大家可以先看看这个问题,看看这个是否有问题呢? 那里有问题呢? 如果你在这个问题上面停留超过5s的话,那么表示你对这块某些知识还有点模糊,需要再巩固下,下面我们一起来分析下! 结论 多线程并发的同时进行set.get操作,A线程调用set方法,B线程并不一定能对这个改变可见!!! 分析 这个类非常简单,里面有一个属
-
Java编程思想中关于并发的总结
知识点摘抄 1.用并发解决的问题大体上可以分为"速度"和"设计可管理性"两种. 2.并发通常是提高运行在单处理器上的程序的性能. 这听起来有些违背直觉.如果你仔细考虑一下就会发现,在单处理器上运行的并发程序开销确实应该比该程序的所有部分都顺序执行的开销大,因为其中增加了所谓上下文切换的代价(从一个任务切换到另一个任务). 使这个问题变得有些不同的是阻塞.如果程序中的某个任务因为该线程控制之外的某些条件(通常是I/O)而导致不能继续执行,那么我们就说这个任务或线程阻塞
-
Java编程思想对象的容纳实例详解
Java提供了容纳对象(或者对象的句柄)的多种方式,接下来我们具体看看都有哪些方式. 有两方面的问题将数组与其他集合类型区分开来:效率和类型.对于Java来说,为保存和访问一系列对象(实际是对象的句柄)数组,最有效的方法莫过于数组.数组实际代表一个简单的线性序列,它使得元素的访问速度非常快,但我们却要为这种速度付出代价:创建一个数组对象时,它的大小是固定的,而且不可在那个数组对象的"存在时间"内发生改变.可创建特定大小的一个数组,然后假如用光了存储空间,就再创建一个新数组,将所有句柄从
-
Java编程数组中最大子矩阵简便解法实现代码
本文研究的主要是Java编程数组中最大子矩阵的相关内容,具体介绍如下. 遇到一个好人,可以改变一生:遇到一本好书,又何尝不是呢? 最近在翻阅 左程云先生的<程序员代码面试指南–IT名企算法与数据结构题目最优解>时就非常的有感悟.建议有这方面爱好的博友,也去观摩观摩. 书中讲解的基于栈的数组的最大矩阵的算法很经典,但是博主能力有限,没能彻底的领悟该算法的精髓,但是根据这个思想,博主想出了一种简易的应对该类问题的算法,现概述如下. 核心思想 先来看一张图吧,我们就可以大致的理解了. 如图,每一个轮
-
Java编程实现中英混合字符串数组按首字母排序的方法
本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法.分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序.例如: String[] arrays = new String[] { "gyu", "sdf", "zf", "大同", "收到", "地方", "三等分"
-
Java编程GUI中的事件绑定代码示例
程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C. 针对java简单的可以理解为程序编译期的绑定:这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定 后期绑定:在运行时根据具体对象的类型进行绑定. 若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间
-
在Java内存模型中测试并发程序代码
让我们来看看这段代码: import java.util.BitSet; import java.util.concurrent.CountDownLatch; public class AnExample { public static void main(String[] args) throws Exception { BitSet bs = new BitSet(); CountDownLatch latch = new CountDownLatch(1); Thread t1 = ne
-
Java编程思想里的泛型实现一个堆栈类 分享
觉得作者写得太好了,不得不收藏一下. 对这个例子的理解: //类型参数不能用基本类型,T和U其实是同一类型. //每次放新数据都成为新的top,把原来的top往下压一级,通过指针建立链接. //末端哨兵既是默认构造器创建出的符合end()返回true的节点. 复制代码 代码如下: //: generics/LinkedStack.java// A stack implemented with an internal linked structure.package generics; publi
-
Java语言面向对象编程思想之类与对象实例详解
在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧. 首先我们来简单的阐述面向对象的思想. 面向对象: 官方的语言很抽象,我们把官方的解释和定义抛开.想想,自己有什么,对!!我们自己有手脚眼口鼻等一系列的器官.来把自己所具有的器官就可以看作我们的属性,自己是不是可以喜怒哀乐和嬉笑怒骂,这些是不是我们的行为,那么自己的具有的属性加自己有的行为就称为一个对象. 注意!!我们自己,一个个体是一个对象,因为,你是你,我是我,我们虽然有相同的,但
-
Web2.0编程思想:16条法则
1.在你开始之前,先定一个简单的目标.无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标.就像"我需要保存一个书签"或者"我准备帮助人们创建可编辑的.共享的页面"这样的目标,让你保持最基础的需求.很多Web 2.0应用的最初吸引之处就是它的简单,避免并隐藏了那些多余的复杂性.站在创建者的立场,可以想象Google的几乎没有内容的主页,还有del.icio.us的简单的线条.从最终用户的角度来看,与之齐名的就是Diggdot.us所提供的初始化页面.
-
简述Java编程之关系操作符
在Java编程过程中,我们常常会遇到比较基本类型或者对象之间的大小关系,下面我们来看看怎么去比较.源码如下: package object; class Value{ int i; } public class E08_StaticTest { public static void main(String[] args) { Integer n1= new Integer(47); Integer n2= new Integer(47); int n3=12; int n4=12; System
随机推荐
- IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
- Python 序列的方法总结
- 完美解决IE不支持Data.parse()的问题
- 用js实现小球的自由移动代码
- 解析C#中的常量及如何在C#编程中定义常量
- 使用C语言提取子字符串及判断对称子字符串最大长度
- mysql 5.7 数据库安装步骤个人总结
- 纯js简单日历实现代码
- jquery滚动条插件(可以自定义)
- javascript继承的六大模式小结
- 用asp实现批量删除bak文件
- Java中的IP地址和InetAddress类使用详解
- 浅谈JQuery+ajax+jsonp 跨域访问
- 详解jQuery简单的表单应用
- 微信小程序 网络API发起请求详解
- Java实现BASE64编码和解码的方法
- Android实现捕获TextView超链接的方法
- 用c语言实现2000内既能被3整除又能被7整除的个数
- C++中4种类型转换方式 cast操作详解
- Android分屏多窗口的实践代码