- 浏览: 500178 次
- 性别:
- 来自: OnePiece
-
最新评论
-
zhanggang807:
第二种方法比较好
<spring> 定时任务每次都执行两次的问题,慎用new ClassPathXmlApplicationContext() -
assasszt:
谢谢分享,很清楚的讲明了原理。
字符集与字符编码简介 -
su0nils000:
难得的笔记
<进阶-2> 打造高效正则表达式 -
足至迹留:
mini188 写道用MD5来解决碰撞是不是也是可行的呢?个人 ...
Hash简介 -
mini188:
用MD5来解决碰撞是不是也是可行的呢?
Hash简介
文章列表
一、 问题描述
先来看一下异常信息,启动tomcat时就报错:
2015-3-20 15:22:39 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class
com.***.***.action.GateWayMonitorListener
java.util.concurrent.RejectedExecutionException
at java.util.co ...
抓住4月尾巴:)
前面介绍的所有原则,比如安全发布,同步策略的规范以及一致性等,他们的安全性都来自于JMM(java内存模型, java memory model)。
1.1 什么是内存模型,为什么需要它
假设一个线程为变量aVariable赋值:
aVariable = 3;
内存模型需要解决这个问题:在什么条件下,读取aVariable的线程将看到这个值为3?在缺少同步的条件下,会有许多因素使得线程无法立即,甚至永远,看到另一个线程的操作结果。
(1)在编译器中生成的指令顺序,可以与源代码的顺序不同,此外编译器还会把变量保存在寄存器而不是内存中;
(2)处理器可以采用乱序或并行等方式来执 ...
一、避免活跃性危险
活跃性没有明确的定义。安全性的含义是“永远不发生糟糕的事情”,而活跃性则关注于另一个目标,即“某件正确的事情最终会发生”。当某个操作无法继续执行下去时,就会发生活跃性问题。在串行程序 ...
一、线程池Executor
大多数并发应用程序都是围绕“任务执行(Task Execution)”来构造的:任务通常是一些抽象的且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构。
当围绕“任务执行”来设计应用程序结构时,第一步就是找出清晰的任务边界,理想情况下,各个任务是相互独立的:任务不依赖于其他任务的状态,结果或边界效应。
大多数服务器应用程序都提供了一种自然的任务边界选择方式:以独立的客户请求为边界。Web服务器,邮件服务器,文件服务器,EJB容器以及数据库服务器等,都能通过网络接受远程客户的连接请求。将独立的请求作为任务边界,既可以实现任务的独立性,又可 ...
4.1 同步容器类
同步容器类包括Vector和Hashtable,二者是jdk的一部分,此外还包括在jdk1.2中添加的一些功能相似的类:由Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将他们的状态封装起来,并对每个公有 ...
[...续上文]
3. 对象的组合
前面我们已经介绍了关于线程安全和同步的一些基础知识。然而,我们并不希望每次内存访问都进行分析以确保程序是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组件或程序。 ...
[...续上文]
2. 对象的共享和发布
我们已经知道了同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是认为关键字synchronized只能用于实现原子性或确定临界区,其实synchronized还有另一个重要方面:内存可见 ...
1.线程安全性
1.1 什么是线程安全性
在构建稳健的并发程序时,必须正确的使用线程和锁。要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)且可变的(Mutable)状态的访问(也就是破坏其中任一个条件都可以保证线程安全,非共享或不可变的状态都不存在线程安全问题)。
“共享”意味着变量可以由多个线程同时访问,而“可变”则意味着变量的值在其生命周期内可以发生变化。前一篇《基础-2 构建线程安全应用程序》提到过,final且在构造函数完成之后才使用的变量是不会引起并发问题的,因为final不具有可变性。关于为什么要构造函数之后使用才安全后面会提到,因为this ...
1.线程状态
线程有如下6种枚举状态:
1)New新生态,2)Runnable 可运行态,3)Blocked被阻塞态 4)Waiting等待态 5)Timed waiting计时等待态 6)Terminated被终止态。
要确定一个线程的当前状态,可以调用Thread的实例方法getState()方法,返回State枚举对象。
1.1 新生线程
当用new操作符创建一个新线程时,如new Thread(r), 该线程还没有开始运行。这意味着它的状态时new。此时程序还没开始运行线程中的代码。
1.2 可运行线程
一旦调用start()方法,线程处于runnable状态。一个“可运行”的线程可 ...
上一篇主要介绍了程序,进程,线程的概念和区别,进程的组成。然后是线程的创建和基本控制。接着本篇就介绍下什么是线程安全,怎样去保证线程安全的基本方法。
二、 构建线程安全应用程序
2.1 什么是线程安全性
线程安全很难给出一个准确的定义。大都是从不同的方面进行一个描述。当对一个复杂对象进行某种操作时,从操作开始到操作结束,该对象中间肯定会经历若干个非法的中间状态。能保证多线程在使用该对象时,每个开始和结束都是稳定合法状态,中间状态不会被其他线程访问,则是线程安全的。
1) 类要成为线程安全的,则首先必须在单线程环境有正确的行为。
2) 正确性和安全性的关系非常类似事务(ACID)的一致性和独立性 ...