- 浏览: 260441 次
- 性别:
- 来自: 上海
博客专栏
-
java并发编程陷阱
浏览量:25158
最新评论
-
谁说我不是会员:
luqixinhe 写道用完freemaker 之后,再也不想 ...
Mybatis-There is no getter for property named 'id' in 'class java.lang.String' -
luqixinhe:
用完freemaker 之后,再也不想用mybatis了
Mybatis-There is no getter for property named 'id' in 'class java.lang.String' -
沧海月明z有泪:
[b][/b]
Mybatis-There is no getter for property named 'id' in 'class java.lang.String' -
FengBaoZhanHu:
谢谢
mybatis-spring-1.0.3-SNAPSHOT及mybatis3.0.6 jar文件 -
不懂甜言蜜语:
感觉for循环里的需求只是线程范围内数据共享,用Thread ...
并发编程陷阱系列 (一)同步不完全
文章列表
之前的文章中已经介绍了无处不在的InterruptedException的处理方式了,使用CountDownLatch也会有类似的问题(正确的处理方式见下面代码: Thread.currentThread().interrupt()),顺便复习下CountDownLatch的使用方法。
在一些应用中,有多个线程,某个线程会在其他线程执行完毕之后才开始执行。
比如,想象有一个程序先下载一堆网页,压缩然后通过EMAIL发送出去。如果要用多线程来实现,压缩网页的程序不能在下载完成后启动。
如何处理呢?一个非常简便的方法就是使用java.util.concurrent中的CountDo ...
对并发读的情况进行测试:
public class SynchronizedDemo {
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws Exception {
Data data = new Data();
Worker t1 = new Worker(data, true, "t1");
Worker t2 = new Wor ...
什么是webservice基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求,从而实现远程调用。为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型(Xml Schema Definition)。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如 SOAP。 目前标准的WebService在数据格式上主要采用SOAP协议。SOAP协议实际上就是一种基于XML编码规范的文本协议。SOAP即简单对象访问协议(Simple Object Access Protocal),它是用于交换XML编 ...
hashtable是线程安全的,但为了保障线程安全,get, put, contains等多个方法都被添加了synchronized,源码片段如下:
public synchronized V get(Object key) {
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ...
并发编程陷阱系列(五)double check
- 博客分类:
- 多线程
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
if (instance == null) //2
instance = new Singleton(); //3
}
}
return instance;
}
The theory behind double-checked locking is perfect. Unfortunately ...
并发编程陷阱系列(四)volatile与变量脏读
- 博客分类:
- 多线程
预备知识:
每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。下面一幅图描述这写交互:
在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变 ...
Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出 阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join,Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
建议使用外部的布尔变量进行控制,比如:
class MyThread extends Thread
{
volatile boolean finished = false;
public void ...
当一个方法抛出 InterruptedException 时,它是在告诉您,如果执行该方法的线程被中断,它将尝试停止它正在做的事情而提前返回,并通过抛出 InterruptedException 表明它提前返回。
一旦你catch了中断异常,默认你就会处理它,所以JVM会清除中断状态,以防止方法退出后上层调用代码再处理一次异常。如果你只是简单地catch住,并不打算处理,那么就需要恢复被清除的中断位,让上层知晓,所以需要调用interrupt()
切忌生吞InterruptedException 异常,正确的做法:
1、将异常传递给调用方。
public class TaskQueu ...
并发编程陷阱系列 (一)同步不完全
- 博客分类:
- 多线程
同步块未覆盖到所有场景。
import java.util.HashMap;
import java.util.Map;
public class CacheManage {
private Map<String, String> cache = new HashMap<String, String>();
public static int THREADS_COUNT = 2;
public void fresh() {
synchronized (cache) {
...
转自:http://www.blogjava.net/toby/archive/2012/02/07/369544.html
工具名称:IBM HeapAnalyzer
JProfiler在java程序性能调试方便表现优越,推荐使用。也可使用下面jdk自己的一些工具。
所有工具都在JDK/bin目录下, jconsole和jvisualvm为GUI图形化工具,其他为命令行。
jvisualvm: GUI工具,可监控、性能评估、故障诊断主机上所有java进程的cpu,内存,线程使用情况,类似于JProfiler,严重推荐。
jinfo:可以输出并修改运行时的java 进程的opts。
...
/**
* Description:
* <br/>Copyright (C), 2008-2010, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
class A
{
public synchronized void foo( B ...