`

线程基本

 
阅读更多

Java 多线程程序设计要点:

http://www.diybl.com/course/3_program/java/javajs/20100522/203539.html 

 

 

所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性

 

方法1:使用ThreadLocal

 private final static ThreadLocal<Boolean> state = new ThreadLocal<Boolean>(); 

方法2:使用同步关键字synchronized

  1.  public void setState(boolean state) {  
  2.         synchronized (this.state) {  
  3.             this.state = state;  
  4.         }  
  5.     } 

 

方法3:使用锁

  1. public void setState(boolean state) {  
  2.         lock.lock();  
  3.         try {  
  4.             this.state = state;  
  5.         } finally {  
  6.             lock.unlock();  
  7.         }  
  8.     }  

 

方法4:使用Atomic类型

 

 private AtomicBoolean state = new AtomicBoolean();  

 

用volatile修饰变量,不能实现类似的功能   volatile有可见性,但没有原子性  解释见下面:

 

转载 :http://www.iteye.com/topic/1124373    

 


 

 

volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源

 

 public   static volatile int  n  =   0 ;  1000

因是声明为volatile的简单变量如果当前值由该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作: 

n  =  n  +   1 ; 
n ++ ; 

 

在使用volatile关键字时要慎重,并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的上一个决定时,如n=n+1、n++ 等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile

 

 

  1. public class ThreadTest{   
  2.   public void test(){   
  3.      Object lock=new Object();   
  4.      synchronized (lock){   // 每个线程进来都会执行Object lock=new Object();每个线程都有自己的lock,根本不存在锁竞争
  5.         //do something   
  6.      }   
  7.   }   
  8. }  

 

 


ThreadLocal与synchronized多线程并发访问区别1

 

http://www.easy518.com/bbs/?p=23

 

 

 

synchronized(core){  // 锁住对象!

core.put();

}

 

 

public synchronized void  put(){// 锁住对象方法!

if (count>=3) {

System.out.println("生产者被阻塞");

try {

this.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return;

}

count++;

this.notify();

}

 

 

 

java.lang.IllegalMonitorStateException

首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:
1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;
2>当前线程不含有当前对象的锁资源的时候,调用obj.notify()方法。
3>当前线程不含有当前对象的锁资源的时候,调用obj.notifyAll()方法。

由线程引发的内存模型分析:
http://www.blogjava.net/qileilove/archive/2011/09/22/359262.html
http://jameswxx.iteye.com/blog/806968
http://guibin.iteye.com/blog/1172731
http://wenku.baidu.com/view/4afaaf2e453610661ed9f4dc.html


  


  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics