论坛首页 Java企业应用论坛

ThreadLocal与synchronized

浏览 107328 次
精华帖 (8) :: 良好帖 (15) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-29  
前一个回帖被评为灌水回复贴。

现在,偶也聊两句非灌水的:
ThreadLocal类 通过构造共享变量的线程副本,使得需要多个线程访问的变量不再“共享”,而是使用自己线程中的此“副本”。通过这种方式,可以使“竞争条件”失效,即多个线程访问变量不再产生竞争,不会产生对数据“脏读”、“读过期数据”等等问题。

synchronized关键字 通过将多线程访问的共享变量与线程锁相关而实现对共享变量的互斥访问。每个线程在进入synchronized块时,都会获取一个与同步块共享对象相关的互斥锁,而退出synchronized块(其中的所有语句都已执行完毕)时会释放锁,如果线程在执行 synchronized 块时,由于时间片到而被调度到等待状态,则其他线程由于无法得到该互斥锁而无法进入synchronized块,会等待。之前被中断的线程在时间片到时,再次进入synchronized块而且接着以前的任务继续执行,因为synchronized块是“可重入”的。

也就是说:
synchronized块将多线程带来的不确定的无序状态变成“有序”的,因为各个线程在访问 synchronized 块时被强制排队,因而也就保证了 synchronized 块中的所有操作具有“原子性”,不会有“竞争条件”存在。由于强制排队,自然会带来效率问题。通常情况下,将整个方法指定为 synchronized 做法是不合时宜的,除非必须这么作。

ThreadLocal类 是把多线程共享的变量“私有化”,只是各自(每个线程)都保存了自己的副本,对此 副本的读写操作不会影响到其他线程。也就不需要各线程之间的协调了。



0 请登录后投票
   发表时间:2008-04-01  
是不是可以这样理解,ThreadLocal的作用是为了不采用全局变量来解决也可以采用全局变量来解决的问题呢??

不知道是不是这样。。。
0 请登录后投票
   发表时间:2008-04-02  
http://www.iteye.com/post/504793
这篇帖子非常正确地解释了ThreadLocal。。。非常到位!
0 请登录后投票
   发表时间:2008-04-06  
klyuan 写道
ThreadLocal与synchronized
Synchronized同步块
  在accessStudent方法中,我们真实需要保护的是student变量,所以我们可以进行一个更细粒度的加锁。我们仅仅对student相关的代码块进行同步。

 synchronized(this) {
	    Random random = new Random();
	    int age = random.nextInt(100);
	    System.out.println("thread "+currentThreadName +" set age to:"+age);
	   
	    this.student.setAge(age);
	   
	    System.out.println("thread "+currentThreadName+" first  read age is:"+this.student.getAge());
	    try {
	    Thread.sleep(5000);
	    }
	    catch(InterruptedException ex) {
	    	ex.printStackTrace();
	    }
}

刚路过看到, 仔细看了一下, 补充一点: 其实这段代码并没有真正的同步你的输出。 the second read 那段的输出代码也应该同步, 这样才同步了你的功能块。 将sleep的时间设成500就可以看出来了。

System.out.println("thread "+currentThreadName +" second read age is:"+this.student.getAge()); 

放到同步块里面catch之后。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics