多线程
文章平均质量分 77
鹅
这个作者很懒,什么都没留下…
展开
-
Java 中的进程与线程
概述进程与线程,本质意义上说, 是操作系统的调度单位,可以看成是一种操作系统 “资源” 。Java 作为与平台无关的编程语言,必然会对底层(操作系统)提供的功能进行进一步的封装,以平台无关的编程接口供程序员使用,进程与线程作为操作系统核心概念的一部分无疑亦是如此。在 Java 语言中,对进程和线程的封装,分别提供了 Process 和 Thread 相关的一些类。本文首先简单的介绍如何使用这些转载 2013-07-18 09:03:34 · 652 阅读 · 0 评论 -
聊天室(自己实现HTTP长连接)
这是一个用自己实现的HTTP长连接做的聊天室.HTTP长连接。在index.html,发起一个异步请求。在请求的Servlet里,把当前sessionId和线程加入到映射列表中,然后把当前线程wait()。在其他人登陆或者发消息的时候,让映射里的所有线程notify(),notify()之后会返回一些数据到页面,页面接收处理之后,再次发起一个新的请求。1.Constants.java,转载 2013-08-06 12:02:09 · 2700 阅读 · 1 评论 -
Java Atomic 包总结
我们知道volatile修饰的变量可以实现基本的加载和赋值的原子性,但是对于像i++等操作就不能保证原子性了,在JDK1.5之前我们只能通过synchronized(阻塞的方式)实现这些复合操作的原子性,在JDK1.5中java.util.concurrent.atomic 包提供了若干个类能实现对int,long,boolean,reference的几个特殊方法非阻塞原子性,这一系列类的主要基于转载 2013-08-06 18:06:32 · 481 阅读 · 0 评论 -
Java 理论与实践: 变还是不变?
不变对象是指在实例化后其外部可见状态无法更改的对象。Java 类库中的 String 、 Integer 和BigDecimal 类就是不变对象的示例 ― 它们表示在对象的生命期内无法更改的单个值。 不变性的长处如果正确使用不变类,它们会极大地简化编程。因为它们只能处于一种状态,所以只要正确构造了它们,就决不会陷入不一致的状态。您不必复制或克隆不变对象,就能自由地共享和高速缓存对它们的转载 2013-08-06 17:09:38 · 454 阅读 · 0 评论 -
Java 理论与实践: 有状态 Web 应用程序都有漏洞吗?
虽然 Java™ 生态系统中存在许多 Web 框架,但它们都直接或间接地基于 Servlets 基础设施。Servlets API 提供大量有用特性,包括通过HttpSession 和 ServletContext 机制提供的状态管理,它允许应用程序在跨多个用户请求时保持状态。然而,在 Web 应用程序中使用共享状态受一些微妙的(并且大部分没有进行说明)的规则控制着,因此导致许多应用程序无意中转载 2013-08-06 17:49:52 · 559 阅读 · 0 评论 -
深入理解Java内存模型(四)——volatile
volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile long vl = 0转载 2013-08-06 09:32:17 · 518 阅读 · 0 评论 -
Java 理论和实践: 安全构造技术
测试和调试多线程程序是极其困难的,因为并发性方面的危险常常不是以一致的方式显现出来,甚至有时未必会显现这种危险性。就线程问题的本质而言,大多数这些问题是无法预料的,甚至在某些平台上(如单处理器系统),或者低于一定的负载,问题可能根本就不出现。由于测试多线程程序的正确性是如此困难,以及查找错误是如此费时,因此从一开始开发应用程序就要在心中牢记线程的安全性,这一点就显得尤为重要。在本文中,我们将研究一转载 2013-08-07 17:14:38 · 489 阅读 · 0 评论 -
Java对象初始化详解
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本文在最后也会对类的初始化进行介绍,相对于对象初始化来说,类的初始化要相对简单一些)。1.Java对象何时被初始化Java对象在其被创建时初始化,在Java代码中,有两种行为可以引起对象的创建。转载 2013-08-08 14:00:02 · 415 阅读 · 0 评论 -
Java线程(六):Callable和Future
上一篇:Java线程(五) 接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿转载 2013-08-21 19:43:38 · 557 阅读 · 0 评论 -
解析 Java 类和对象的初始化过程
简介: 类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来分析的文章更是鲜有所见。本文主要对类和对象初始化全过程进行分析,通过一个实际问题引入,将源代码转换成 JVM 字节码后,对 JVM 执行过程的关键点进行全面解析,并在文中穿插入了相关转载 2013-08-13 21:27:36 · 573 阅读 · 0 评论 -
Callable,Runnable比较及用法
编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable.Runnable和Callable的区别是,(1)Callable规定的方法是call(),Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得(3)call方法可以抛出异常,ru转载 2013-08-26 19:56:31 · 450 阅读 · 0 评论 -
多线程并发实践_笔记_第六章
任务执行6.1在线程中执行任务【1】概念:《1》任务:任务就是抽象、离散的工作单元《2》任务的边界:应该指明明确的任务边界,尽量使得任务时独立的活动,不依赖其他线程的状态、结果或边界效应,例如web服务器不同的客户请求不会相互影响【2】顺序的执行任务:单线程执行,响应性和吞吐量都较差,除了单一的用户和任务执行时间很短的特殊情况下都不适用原创 2013-08-25 20:22:45 · 574 阅读 · 0 评论 -
Java 7 Fork/Join 框架
在 Java7引入的诸多新特性中,Fork/Join 框架无疑是重要的一项。JSR 166旨在标准化一个实质上可扩展的框架,以将并行计算的通用工具类组织成一个类似java.util中Collection一样的包。其目标是使之对开 发人员易用且易维护,同时该框架也旨在并行计算地高质量实现。目前已经有多个新的类和接口被添加到该框架中了。该新特性主要是解决Java社区中对于如synchroniz转载 2013-08-16 18:03:57 · 667 阅读 · 0 评论 -
Java线程中断的本质深入理解
一、Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。public b转载 2013-08-18 20:06:58 · 705 阅读 · 1 评论 -
Java 理论与实践: 嗨,我的线程到哪里去了?
当单线程应用程序中的主线程抛出一个未捕获的异常时,因为控制台中会打印堆栈跟踪(也因为程序停止),所以您很可能注意到。但在多线程应用程序中,尤其是在作为服务器运行并且不与控制台相连的应用程序中,线程死亡可能成为不太引人注目的事件,这会导致局部系统失败,从而产生混乱的应用程序行为。在 Java theory and practice十月份的专栏文章 中,我们研究了线程池,并研究了编写得不正确的转载 2013-09-09 08:34:23 · 419 阅读 · 0 评论 -
多线程并发实践_笔记_第七章
取消或关闭1.概念:《1》java不提供强迫线程停止手头工作的机制,只提供终端——协作机制《2》当外部代码能再活动自然完成之前把,把它更改为完成状态,那么这个活动是可取消的。2.中断:中断通常是实现取消的最佳选择《1》每个线程都含有一个中断状态,在中断的时候这个状态被设置为true《2》interrupted方法的方法名容易使人迷原创 2013-08-28 20:33:07 · 641 阅读 · 0 评论 -
验证并发可见性出现问题
验证代码如下/** * 可用于验证并发可见性问题,预计可能出现出现该线程一直阻塞的状态 验证没有成功 据说是因为client JVM和ServerJVM的问题 * windows下,默认是CLient JVM * */public class test { private static boolean ready; private static int number原创 2013-08-01 18:05:04 · 680 阅读 · 0 评论 -
内存屏障与JVM并发
内存屏障与JVM并发 内存屏障,又称内存栅栏,是一组处理器指令,用于实现对内存操作的顺序限制。本文介绍了内存屏障对多线程程序的影响。我们将研究内存屏障与JVM并发机制 的关系,如易变量(volatile)、同步(synchronized)和原子条件式(atomic conditional)。本文假定读者已经充分掌握了相关概念和Java内存模型,不讨论并发互斥、并行机制和原子性。内存屏障用转载 2013-08-02 09:47:51 · 604 阅读 · 0 评论 -
编写多线程的 Java 应用程序
几乎所有使用 AWT 或Swing编写的画图程序都需要多线程。但多线程程序会造成许多困难,刚开始编程的开发者常常会发现他们被一些问题所折磨,例如不正确的程序行为或死锁。在本文中,我们将探讨使用多线程时遇到的问题,并提出那些常见陷阱的解决方案。线程是什么?一个程序或进程能够包含多个线程,这些线程可以根据程序的代码执行相应的指令。多线程看上去似乎在并行执行它们各自的工作,就像在一台计算机上转载 2013-07-23 16:49:51 · 398 阅读 · 0 评论 -
Java 程序中的多线程
看一看开发和使用线程是多么容易Neel V. Kumar ([email protected]), 软件工程师, Terway.com简介: 由于在语言级提供了线程支持,在 Java 语言中使用多线程要远比在 C 或 C++ 中来得简单。本文通过简单的程序示例展现了在 Java 程序中线程编程的简单性。在学习完本文后,用户应该能够编写简单、多线程的程序。发布日期转载 2013-07-19 09:44:02 · 452 阅读 · 0 评论 -
关于synchronized,对象锁的理解
要想很好的理解synchronized 必须理解好什么是对象锁。关于对象锁的理解: 刚开始真的有点难理解这个对象锁的概念,在网上搜了一大堆,感觉还是不怎么清晰。今天在次理解了下对象锁,突然发现这个对象锁并不难理解,关键是你要明白这个对象指的是什么?[size=medium]其实这个对象指的是拥有synchronized修饰的函数,或者是代码块的一个类的实例。当某个线程访问该转载 2013-07-19 11:02:36 · 2416 阅读 · 0 评论 -
关于 java.util.concurrent 您不知道的 5 件事,第 1 部分
Concurrent Collections 是 Java™ 5 的巨大附加产品,但是在关于注释和泛型的争执中很多 Java 开发人员忽视了它们。此外(或者更老实地说),许多开发人员避免使用这个数据包,因为他们认为它一定很复杂,就像它所要解决的问题一样。事实上,java.util.concurrent 包含许多类,能够有效解决普通的并发问题,无需复杂工序。阅读本文,了解 java.util转载 2013-07-22 10:57:46 · 420 阅读 · 0 评论 -
关于 java.util.concurrent 您不知道的 5 件事,第 2 部分
并发 Collections 提供了线程安全、经过良好调优的数据结构,简化了并发编程。然而,在一些情形下,开发人员需要更进一步,思考如何调节和/或限制线程执行。由于java.util.concurrent 的总体目标是简化多线程编程,您可能希望该包包含同步实用程序,而它确实包含。本文是 第 1 部分 的延续,将介绍几个比核心语言原语(监视器)更高级的同步结构,但它们还未包含在 Collec转载 2013-07-22 10:59:49 · 413 阅读 · 0 评论 -
Java 技术: 使您轻松地进行多线程应用程序编程(生产者消费者模式的优化)
多线程应用程序通常利用生产者-消费者编程方案,其中由生产者线程创建重复性作业,将其传递给作业队列,然后由消费者线程处理作业。虽然这种编程方法很有用,但是它通常导致重复的代码,这对于调试和维护可能是真正的问题。为了解决这个问题并促进代码重用,我们创建了 Consumer 类。 Consumer 类包含所有用于作业队列和消费者线程的代码,以及使这两者能够结合在一起的逻辑。这使我们可以专注于业务逻辑转载 2013-07-29 17:46:34 · 703 阅读 · 0 评论 -
Java 生产者消费者问题
生产者消费者问题是研究多线程程序时绕不开的问题,它的描述是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。 解决生产者消费者问题的方法有两种,一种是采用某种机制保持生产者和消费者之间的同步,一种是在生产者和消费者之间建立一个管道。前一种有较高转载 2013-07-29 16:04:40 · 442 阅读 · 0 评论 -
使用JAVA建立稳定的多线程服务器
Java语言是完全面向对象的,它的线程机制和对象序列化特别容易使用,使用Java来建立一套多线程服务器要比使用其它语言方便的多,如果你再把它的异常处理机制利用好,那么你就可以建立一个商业级的多线程服务器了。由于采用了消息队列和Socket传输方式,所以不会出现丢消息的问题。这套服务器可以作为实时聊天服务器、多人协同的协作服务器等等。消息系统的建立这套服务器的消息系统采用的是对象传输的机制,转载 2013-07-29 18:10:19 · 527 阅读 · 0 评论 -
Java单例对象同步问题探讨
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。正是由于这个特点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可。这种方转载 2013-07-30 13:49:56 · 408 阅读 · 0 评论 -
Java 理论与实践: 正确使用 Volatile 变量
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主要特性:转载 2013-07-23 14:18:02 · 371 阅读 · 0 评论 -
线程调度
有两种调度模型:分时调度模型和抢占式调度模型。分时调度模型是指让所有的线程轮流获得cpu的使用权,并且平均分配每个线程占用的CPU的时间片这个也比较好理解。java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用CPU。处于运行状态的线程会一直运行,直至它不得不放弃CPU。一个线程会因为以下转载 2013-07-23 16:26:51 · 534 阅读 · 0 评论 -
java高级进阶关于java多线程的应用 ThreadLocal多线程实例详解
ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程” 。其实,ThreadLocal并不是一个 Thread,而是 Thread 的局部变量,也许把它命名为 ThreadLocalVariable更容易让人理解一些。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其转载 2013-07-30 16:51:36 · 621 阅读 · 0 评论 -
Java实时多任务调度过程中的安全监控设计
在一系列关联的多任务的实时环境中,如果有一个任务发生失败,可能导致所有任务产生连锁反应,从而造成调度失控的局面。特别是对于核心控制设备尤其重要,为了解决这个问题,必须对每个任务进行实时监控。问题分析在JAVA环境中,一个任务一般是由一个独立线程来引导实现的,独立线程可能调用一系列子线程。如果在执行过程中,某一个线程发生异常(产生的原因很多,比如软件升级、运行环境改变、系统资抢占等),那么该转载 2013-07-30 11:23:21 · 513 阅读 · 0 评论 -
轻松使用线程: 减少争用
当我们说一个程序“太慢”时,我们通常是指两个性能属性 — 等待时间和可伸缩性 — 中的一个。 等待时间指完成一个给定任务所花费的时间,而 可伸缩性则指随着负载的增加或给定计算资源的增加,程序的性能将怎样变化。严重的争用对等待时间和可伸缩性都不利。 争用为什么是这样一个问题争用同步之所以慢,是因为它涉及多个线程切换和系统调用。当多个线程争用同一个管程时,JVM 将不得不维护一个等待该管程转载 2013-07-30 16:35:36 · 487 阅读 · 0 评论 -
轻松使用线程: 不共享有时是最好的
编写线程安全类是困难的。它不但要求仔细分析在什么条件可以对变量进行读写,而且要求仔细分析其它类能如何使用某个类。 有时,要在不影响类的功能、易用性或性能的情况下使类成为线程安全的是很困难的。有些类保留从一个方法调用到下一个方法调用的状态信息,要在实践中使这样的类成为线程安全的是困难的。管理非线程安全类的使用比试图使类成为线程安全的要更容易些。非线程安全类通常可以安全地在多线程程序中使用,只要您转载 2013-07-30 17:13:21 · 433 阅读 · 0 评论 -
以一个固定、全局次序获取多个锁
当两个或多个线程互相等待时被阻塞,就会发生死锁。例如,第一个线程被第二个线程阻塞,它在等待第二个线程持有的一个资源。而第二个线程在获得第一个线程持有的某个资源之前不会释放这个资源。由于第一个线程在获得第二个线程持有的那个资源之前不会释放它自己所持有的资源,而第二个线程在获得第一个线程持有的一个资源之前也不会释放它所持有的资源,于是这两个线程就被死锁。 在编写多线程代码时,死锁是最难处理的问题转载 2013-07-30 11:53:42 · 670 阅读 · 0 评论 -
JDK 7 中的 Fork/Join 模式
介绍随着多核芯片逐渐成为主流,大多数软件开发人员不可避免地需要了解并行编程的知识。而同时,主流程序语言正在将越来越多的并行特性合并到标准库或者语言本身之中。我们可以看到,JDK 在这方面同样走在潮流的前方。在 JDK 标准版 5 中,由 Doug Lea 提供的并行框架成为了标准库的一部分(JSR-166)。随后,在 JDK 6 中,一些新的并行特性,例如并行 collection 框架,合并转载 2014-06-26 14:31:39 · 522 阅读 · 0 评论