Java并发编程:进程的创建 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} Java并发编程:进程的创建 Table of Contents 1. Runtime.getRuntime().exec() 2. ProcessBuilder.start() 上次聊了进程和线程的相关概念,那么,怎么在Java中创建一个进程呢? 当我们创建一个应用程序,然后执行这个程序,系统肯定会创建一…
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 若有不正之处,请多多谅解并欢迎指正. 请…
java并发编程涉及到很多内容,当然也包括多线程,再次补充点相关概念 原文地址:http://www.cnblogs.com/dolphin0520/p/3910667.html 一.操作系统中为什么会出现进程? 说起进程的由来,我们需要从操作系统的发展历史谈起. 也许在今天,我们无法想象在很多年以前计算机是什么样子.我们现在可以用计算机来做很多事情:办公.娱乐.上网,但是在计算机刚出现的时候,是为了解决数学计算的问题,因为很多大量的计算通过人力去完成是很耗时间和人力成本的.在最初的时候,计算机…
转载自海子:http://www.cnblogs.com/dolphin0520/p/3910667.html Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一…
计划写几篇文章讲述下Java并发编程,帮助一些初学者成体系的理解并发编程并实际使用,而不只是碎片化的了解一些Synchronized.ReentrantLock等技术点.在讲述的过程中,也想融入一些相关技术.概念的发展历史,这样便于看到其演化过程而更好地进行理解.文字描述上希望是更通俗些,如果阅读者能在寥寥文字中稍有所得就很满足了. 什么是进程? 在日常使用计算机的过程中我们会用各类的软件来处理各种事物,比如听歌.看视频.写文档等等.对于相对简单的软件对应于Windows操作系统就是一个任务,用…
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cnblogs.com/wengshuhang/p/10200269.html 这两天在看<java并发编程的艺术>,记录下看到的知识当做笔记吧! java中的synchronized锁是存储在对象头中的,内容是mark word,长度根据计算机的位数来定32 or 64bit, 锁一共有4种状态,级…
一.锁重入 package com.roocon.thread.t6; public class Demo { /* 当第一个线程A拿到当前实例锁后,进入a方法,那么,线程A还能拿到被当前实例所加锁的另一个 同步方法b吗?是不是只有当线程A释放了a方法的同步锁后,才可以去获取b方法的同步锁呢? */ public synchronized void a(){ System.out.println("a"); b(); } public synchronized void b(){ Sy…
上一章已经提到“如果一个进程被多次回滚,迟迟不能占用必需的系统资源,可能会导致进程饥饿”,本文我们详细的介绍一下“饥饿”和“公平”. Java中导致饥饿的原因 在Java中,下面三个常见的原因会导致线程饥饿: 高优先级线程吞噬所有的低优先级线程的CPU时间. 线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问. 线程在等待一个本身(在其上调用wait())也处于永久等待完成的对象,因为其他线程总是被持续地获得唤醒. 高优先级线程吞噬所有的低优先级线程的C…
以下内容转自http://ifeve.com/starvation-and-fairness/: 如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为“饥饿”.而该线程被“饥饿致死”正是因为它得不到CPU运行时间的机会.解决饥饿的方案被称之为“公平性”–即所有线程均能公平地获得运行机会.  下面是本文讨论的主题: 1. Java中导致饥饿的原因: 高优先级线程吞噬所有的低优先级线程的CPU时间. 线程被永久堵塞在一个等待进入同步块的状态. 线程在等待一个本身也处于…
先做总结: 1.为什么要用ReentrantLock? (1)ReentrantLock与synchronized具有相同的功能和内存语义: (2)synchronized是重量级锁,性能不好.ReentrantLock性能好: (3)ReentrantLock可操作性强,如:实现条件Condition,读写锁,可轮询,使用更灵活. 2.ReentrantLock实现原理 (1)ReentrantLock的属性sync是一个Sync(继承了AQS)对象 (2)获取锁的标志: sync.state…
本文参考<深入理解java虚拟机第二版> 一.什么是线程安全? 这里我借<Java Concurrency In Practice>里面的话:当多个线程访问一个对象,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的. 我的理解:多线程访问一个对象,任何情况下,都能保持正确行为,就是对象就是安全的. 我们可以将Java语言中各种操作共享的数据分为以下5类:不可变.…
显式锁 一.Lock与ReentrantLock Lock提供了一种无条件的.可轮询的.定时的以及可中断的锁获取操作,所有的加锁和解锁方法都是显式的 ReentrantLock实现了Lock:并提供了和synchronized相同的内存语义:同时提供了可重入的加锁语义 1.基本语义: void LockDefinition() { Lock lock = new ReentrantLock(); try { //do someting //更新对象状态,捕获异常:并在必要时恢复不变性条件 } f…
我们在这篇文章中主要讨论如何使用互斥锁来解决并发编程中的原子性问题. 目录 概述 互斥锁模型 互斥锁简易模型 互斥锁改进模型 Java世界中的互斥锁 synchronized中的锁和锁对象 synchronized示例 锁与受保护的资源的关系 一个锁保护多个资源 一个锁保护多个没有关联关系的资源 一个锁保护多个有关联关系的资源 概述 并发编程中的原子性问题的源头是线程切换,那么禁止线程切换可以解决原子性问题吗? 这需要分情况讨论,在单核CPU的情况下,同一时刻只有一个线程执行,禁止CPU中断,就…
CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链表是因为这些结点之间没有明显的next指针,而是通过myPred所指向的结点的变化情况来影响myNode的行为.CLHLock上还有一个尾指针,始终指向队列的最后一个结点.CLHLock的类图如下所示:       当一个线程需要获取锁时,会创建一个新的QNode,将其中的locked设置为true…
互斥锁(上):解决原子性问题 原子性问题的源头是线程切换,操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换. 在早期单核 CPU 时代,这个方案的确是可行的,而且也有很多应用案例,但是并不适合多核场景. 这里我们以 32 位 CPU 上执行 long 型变量的写操作为例来说明这个问题,long 型变量是 64 位,在 32 位 CPU 上执行写操作会被拆分成两次写操作 在单核 CPU 场景下,同一时刻只有一个线程执行,禁止 CPU 中断,意味着操作系统不会重…
个人博客网:https://wushaopei.github.io/    (你想要这里多有) 声明:实际上,在开发中并不会普遍的使用Thread,因为它具有一些弊端,对并发性能的影响比较大,如下:    new Thread 弊端: 每次 new Thread 新建对象,性能差: 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或OOM: 缺少更多功能,如更多执行.定期执行.线程中断 一. 线程池-1 1.线程池的好处 重用存在的线程,减少对象创建.消亡的开销,…
第10章 避免活跃性危险 10.1 死锁 -10.1.1 锁顺序死锁 最简单的一种死锁形式: -10.1.2 动态的锁顺序死锁 可以通过下面的方法来解决: -10.1.3 在协作对象之间发生死锁 -10.1.4 开放调用 如果在调用某个方法时不需要持有锁,那么这种调用就被称为开放调用. -10.1.5 资源死锁 当多个线程在相同资源上等待时,也会发生死锁. 10.2 死锁的避免与诊断 -10.2.1 支持定时的锁 显示使用Lock类中的定时tryLock功能(见13章)来代替内置锁机制. -10…
锁的作用 控制多个线程访问共享资源. 线程协作 Lock接口 特点 与synchronized类似的同步功能,只是需要显式地获取和释放锁.缺少隐式获取锁的便捷性. 拥有锁获取与释放的可操作性.可中断的获取锁以及超时获取锁等多种同步特性. 可扩展性好. 尝试非阻塞地获取锁:如果当前时刻锁没有被占用,则获得锁. 能被中断地获取锁:获得锁的线程能被中断,当获得锁的线程被中断,中断异常会被抛出,然后锁会被释放 . 超时获取锁:在一定时间内尝试获取锁,如果超时,就返回. 使用方式 Lock lock =…
互斥锁(下):如何用一把锁保护多个资源?    一把锁可以保护多个资源,但是不能用多把锁来保护一个资源. 那如何保护多个资源? 当我们要保护多个资源时,首先要区分这些资源是否存在关联关系. 如下代码 1 class Account { 2 // 锁:保护账户余额 3 private final Object balLock = new Object(); 4 // 账户余额 5 private Integer balance; 6 // 锁:保护账户密码 7 private final Obje…
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QNode中包含有一个locked的字段,该字段表示该节点是否需要获取锁,为true表示需要获取,为false表示不需要获取.在CLH队列中,节点与节点之间并不是通过next指针来连接的而是通过myPred所指向节点的变化情况来影响的myNode的行为. 假设有两个线程(线程A.线程B).开始线程A需要…
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格依照FIFO的队列.他可以确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QNode中包括有一个locked的字段,该字段表示该节点是否须要获取锁.为true表示须要获取,为false表示不须要获取.在CLH队列中,节点与节点之间并非通过next指针来连接的而是通过myPred所指向节点的变化情况来影响的myNode的行为. 如果有两个线程(线程A.线程B).開始线程A须要获…
这篇文章是Java并发编程思想系列的第一篇,主要从理解Java并发编程历史的原因和Java并发演进过程两部分,以极简地回溯并发编程的历史,帮助大家从历史这个角度去了解一门语言一个特性的演进.对历史理解的越多,思考的越多,未来的方向就会更加坚定. 我是谁?从哪来?到哪去?--柏拉图 一.为什么了解并发编程历史 没有一个新事物一出现就是完美的.回溯Java并发演进的历史,既可以从宏观的角度了解世界上正在发生的变化[知乎],又可以让我们真正的理解当时设计的背后逻辑和历史原因,学习前人决策的智慧,指导我…
一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验,所以我就一起帮着分析.最开始看到这个时很烦燥啊,因为自己接触java时间很短,连synchronized都不知道怎么用呢,突然发现有这么个复杂的东西.当时就只好开始学习吧,毕竟是使用嘛,第一目的就是了解清楚这玩意的各个类与方法都干嘛用的,然后看了看同事的代码大概也就清楚了.感觉这和大部分人一样,能…
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来先得到的原则,在排队中,无论身份贵贱,一律平等对待.这是就是我们现实生活中的公平.大家都喜欢公平的.但是在Java中默认是非公平的,为什么呢? 本文主要内容:公平锁的现实生活理解:公平锁演示:为什么Java中默认是非公平锁(公平锁的非公平锁的比较) 本篇是<凯哥(凯哥Java:kagejava)并发…
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识,然后再阐述如何创建线程以及如何创建进程.下面是本文的目录大纲: 一.Java中关于应用程序和进程相关的概念 二.Java中如何创建线程 三.Java中如何创建进程 若有不正之处,请多多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dol…
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 若有不正之处,请多多谅解并欢迎指正. 请…
转自:http://www.cnblogs.com/dolphin0520/p/3910667.html 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会…
java并发编程笔记(九)--多线程并发最佳实践 使用本地变量 使用不可变类 最小化锁的作用域范围 使用线程池Executor,而不是直接new Thread执行 宁可使用同步也不要使用线程的wait和notify 使用BlockingQueue实现生产-消费模式 使用并发集合而不是加了锁的同步集合(比如Collections.synchronized这些集合尽量避免使用,应该用J.U.C中提供的专门的同步集合) 使用Semaphore创建有界的访问 宁可使用同步代码块,也不要使用同步的方法 避…
一.理论层面 内置锁与互斥锁 修饰普通方法.修饰静态方法.修饰代码块 package com.roocon.thread.t3; public class Sequence { private static int value; // synchronized放在普通方法上,内置锁就是当前方法的实例 public synchronized int getNext(){ return value++; } // synchronized修饰静态方法,内置锁就是当前的Class字节码对象Sequen…
并发编程的一些概念 同步和异步 同步: 同步方法必须等到方法调用返回后,才能继续后继的行为.也就是说,同步方法执行时,如果没有返回,则后面的方法是执行不到的.同步方法调用,调用过程中可能出现阻塞和等待. 比如说,java读取控制台输入就是同步方法. 异步: 异步方法调用后立即返回,可以立即执行后继的方法.异步方法的返回结果,采用通知的方式来告知调用者.异步方法调用,调用过程中不会出现阻塞和等待. 举个例子:js的ajax方法就默认是异步调用的,执行后马上返回,继续执行下面的代码.如果你想操作结果…