并发

并发编程和并行编程有什么区别?

风流意气都作罢 提交于 2020-03-08 18:16:49
并行编程和并行编程有什么区别? 我问谷歌,但没有找到任何可以帮助我理解这种差异的东西。 你能给我两个例子吗? 现在,我找到了以下解释: http : //www.linux-mag.com/id/7411- 但是“并发是程序的属性”与“并行执行是机器的属性”对我来说还不够-我还是不能说什么。 #1楼 我在一些博客中找到了此内容。 认为它是有用和相关的。 并发和并行性不是一回事。 如果未预先确定两个任务的执行顺序,则两个任务T1和T2是并发的, T1可以在T2之前执行并完成,T2可以在相同时间(并行)同时执行T1,T1和T2之前执行并完成,T1和T2可以交替执行,...如果有两个并发线程如果操作系统将其调度为在一个单核非SMT非CMP处理器上运行,则可能会并发但不会并行。 并行可能在多核,多处理器或分布式系统上进行。 并发通常被称为程序的属性,并且是比并行性更笼统的概念。 资料来源: https : //blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming #2楼 我相信并发编程是指多线程编程,它是让您的程序运行从硬件详细信息中抽象出来的多个线程。 并行编程是指专门设计程序算法以利用可用的并行执行。 例如,您可以并行执行某些算法的两个分支

关于java中的interrupt

安稳与你 提交于 2020-03-02 17:15:37
一、概念 java中线程有开始,运行(就绪,运行),阻塞,等待,终止这几种状态。其中在等待的时候可以通过设置中断标志位来唤醒线程。一般情况下等待状态的线程检查到中断标志被置位,则会抛出InterruptedException异常,捕获异常,复位中断标志,可以使线程继续运行。 thread.interrupt() 设置中断标识位 Thread.interrupt() 回复中断标识位 thread.isInterrupted() 返回中断标识位 什么情况下可以使用Interrunpt (1)如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。 (2)如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。这时候处理方法一样

关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

匆匆过客 提交于 2020-03-02 09:16:28
一、前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”; 我当时的想法:方法中的局部变量在运行的时候,是存在JAVA栈中的,方法运行结束,局部变量也就都弹光了,理论上单线程的话是不会有问题的,我之所以不知道,是因为不清楚在JAVA内存模型中,一个线程对应一个栈,还是多个线程共享一个栈... 其实如果知道每个线程都有一个自己的JAVA栈的话,问题也就很清楚了,不会被其它线程给污染掉; 当然,问题并不能止于此,这个问题已经暴露出自己对这方面比较薄弱,因此打算对JAVA内存模型和多线程并发问题做个小小总结; 二、JAVA中的内存模型 程序运行的时候,内存主要由以下部分组成: 堆 :所有线程共享一个堆;存放的都是new 出来的对象;由垃圾回收器回收; 方法区 :所有线程共享一个方法区;里面存放的内容有点杂,可以认为是除堆和栈中的其它东西(如类信息,静态变量,常量,代码等);Java虚拟机规范规定可以不对方法区进行垃圾回收,当并不是不回收,主要看具体虚拟机的实现,比如可以回收一些废弃常量和无用的类; 程序计数器 :也叫PC,存放下一条指令所在单元的地址的地方; JAVA栈 :每个线程都有一个自己的JAVA栈;存放的一般是方法的局部变量,方法出口信息等

【转】成为Java顶尖程序员 ,看这10本书就够了

霸气de小男生 提交于 2020-03-02 04:17:21
“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处:   1.能出版出来的书一定是经过反复的思考、雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料   2.对着书上的代码自己敲的时候方便   “看完书之后再次提升自我的最好途径是看一些相关的好博文“,我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提炼,对于梳理学习的内容很有好处,当然这里不是说自己的学习方法,就不再扯下去了。   很多程序员们往往有看书的冲动,但不知道看哪些书,下面我就给各位Java程序猿们推荐一些好书(每本书的作者会加粗标红),其中绝大多数都是我自己平时在看的书,也算是我对于平时读的书做一个小总结和读后感吧。   首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life。   目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客。这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是:   1、随便开篇点明该设计模式的定义   2、图文并茂讲解该设计模式中的结构   3、以详细的代码形式写一下该种设计模式的实现   4、补充内容   5、讲解该设计模式的优缺点  

Padded优化LinkedTransferQue并发性能是错误方向

孤街醉人 提交于 2020-03-01 08:44:15
在Grizzly中,自带了LinkedTransferQueue,和JDK 7自带的LinkedTransferQueue有所不同,不同之处就是使用PaddedAtomicReference来提升并发性能,其实这是一种错误的编码技巧,没有意义! AtomicReference和LinkedTransferQueue的本质是乐观锁,乐观锁的在激烈竞争的时候性能都很糟糕,乐观锁应使用在非激烈竞争的场景,为乐观锁优化激烈竞争下的性能,是错误的方向,因为如果需要激烈竞争,就应该使用悲观锁。 以下是一个JDK中内置乐观锁悲观锁的对照表: 乐观锁 -----> 悲观锁 AtomicInteger -----> Lock + volatile int AtomicLong -----> Lock + volatile long AtomicReference -----> Lock + volatile LinkedTransferQueue -----> LinkedBlockingQueue 在激烈竞争中,LinkedTransferQueue的性能,远远低于LinkedBlockingQueue,使用PaddedAtomicReference优化也是一样的。如果不激烈竞争,Padded-LinkedTransferQueue和LinkedTransferQueue相比也没有什么优势。

项目问题总结一、全局变量引起的并发问题

空扰寡人 提交于 2020-02-28 23:26:32
最近刚完成了一个短彩信群发平台的开发工作,系统采用springmvc+hibernate+jdbctemplate+mysql架构。其中遇见许多问题,闲暇之余记录下来以避免在后续项目中再犯同样的错误。 先看下面小段代码,一个controller,一个service。 controller.java代码: ........ @Autowired private XXXService xxxService; ........ @RequestMapping("/doXXX.do") public void doXXX(){ ..... xxxService.saveXXX(String content,....); ..... } XXXService.java代码: private String content; ...... private void init(){//清空请求参数 content = null; ...... } public boolean saveXXX(String content, ......){ this.init(content, ...); this.content = content; //业务逻辑处理 } 以上这段代码在访问量不构成并发时不会出现什么问题。 但当一个请求还未完成,另一个请求已经开始执行的情况下就会出现问题(并发):

java并发callable,runnable,future和futureTask

假如想象 提交于 2020-02-28 21:10:10
java多线程 java实现多线程有两种方式:一个是直接继承Thread类,一种是实现Runnable接口。但这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。于是后面又增加了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。 callable与runnable java.lang.Runnable是一个接口,在它里面只声明了一个run()方法: public interface Runnable { public abstract void run(); } 由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。   Callable位于java.util.concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做call(): public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception; } 可以看到,这是一个泛型接口,call(

并行、并发、同步和互斥

﹥>﹥吖頭↗ 提交于 2020-02-28 20:52:50
并行 计算机操作系统中的并行,指的是同时存在于内存中的 多道作业都处于运行状态 。实际上都是 宏观上并行 , 微观上串行 ,因为这些作业都是开始各自的运行,但都没运行完毕,只是 交替地使用cpu 。 在操作系统中是指,一组程序按独立异步的速度执行,不等于时间上的重叠(同一个时刻发生)。要区别并发。并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)。 并行也指8位数据同时通过并行线进行传送 ,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错。 并发 在 操作系统 中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个 处理机 上运行,但 任一个时刻点上只有一个程序在处理机上运行 。   在关系数据库中,允许多个用户同时访问和更改共享数据的进程。SQL Server 使用锁定以允许多个用户同时访问和更改共享数据而彼此之间不发生冲突。   操作系统并发程序执行的特点:   并发环境下,由于程序的封闭性被打破,出现了新的特点:   ①程序与计算不再一一对应,一个程序副本可以有多个计算   ②并发程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争某一资源,如处理机、 缓冲区 等。   ③并发程序在执行中是走走停停

pgpool-II 数据库集群工具的安装配置(主要是记录下安装过程中遇到的问题)

女生的网名这么多〃 提交于 2020-02-28 12:36:47
前部分: 下载:下载后的源码包中就包含中文手册和入门教程。 http://www.pgpool.net/mediawiki/index.php/Downloads 记住,ubuntu的话,挑选源代码下载!否则./configure的时候会报".PO"文件缺失的错误! 安装: ①./configure ②make&&make install 配置: pgpool-II 的配置参数保存在 pgpool.conf 文件中。文件以每行 “parameter = value” 的格式保存。当你安装 pgpool-II 后, pgpool.conf.sample 被自动建立。我们建议拷贝或者重命名它为 pgpool.conf ,然后你可以随意编辑它。 $ cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.conf pgpool-II 默认只接受到 9999 端口的本地连接。如果你希望从其他主机接受连接,请设置 listen_addresses 为 '*'. listen_addresses = 'localhost' port = 9999 4.启动: pgpool -n & 注意:如果提示“ could not open pid file as /var/run/pgpool/pgpool.pid. reason: No

Linux基础知识3

吃可爱长大的小学妹 提交于 2020-02-17 14:22:51
原文链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/6876344 原文链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/6878477 原文链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/6882246 Q1. 什么是临界区?什么是竞争状态?什么是同步? A: 临界区(critical regions)就是访问和操作共享数据的代码段,多个内核任务并发访问同一个资源通常是不安全的; 如果两个内核任务可能处于同一个临界区,就是一种错误现象;如果确实发生了这种情况,就称它为竞争状态; 避免并发和防止竞争状态称为同步(synchronization)。 Q2. 简要介绍一下死锁及避免死锁的方法。 A: 死锁包括自死锁和ABBA死锁, 产生死锁有四个原因:互斥使用、不可抢占、请求和保持,以及循环等待; 避免死锁的方法有:破坏“不可剥夺”条件、破坏“请求和保持”条件、破坏“循环等待”条件。 Q3. 内核中造成并发执行的原因是什么? A: “并发”分为“伪并发”和“真并发”两种,内核中造成并发执行的原因有以下几种: 中断:它可能随时打断当前正在执行的代码; 内核抢占