多线程笔记

1、synchronized以线程为单位,不是以调用为单位,通过线程中,如果这个线程已经获得了锁,则这个线程中的所有函数都获得锁,可以进入这个锁锁定的范围,也就是reentrancy。如

   public class A {public synchronized add(){};}

   public class B extends A{public synchronized add(){super.add()}};

   B.add获得对象锁后,在调用super.add()就不会出现死锁问题,也就是锁重进入

 

2、AtomicLong,AtomicReference等方便的原子计数器

 

3、synchronized是排斥锁,JDK1.5后有个类似的叫信号的家伙Semaphore,Semaphore可以定义同时有多少个访问量,当为1是就是synchronized类似,不过没synchronized安全,也不具备reentrancy功能,如果在第一点中改用semaphore,容易产生死锁。

 

4、对于long和double,在64位下,如果没什么volatile或者读写加上synchronized时,VM将它们分成32位的读写操作,因此线程不安全。volatile表示不允许VM优化这个变量的读取和写入,也就是读时不会同时写,写时也不会发生读,(但是不保证多个同时写的结果一致性)从而保证原子性。不推荐使用volatile,因为难以理解,volatitle只保证可见性(能够看到和获取别的线程修改了值),不保证操作原子性定,如果能确定只有一个线程在写,其他线程都只是读时,volatitle就和synchronized效果一样,如果多线程写,则volatitle无法保证写的结果是一致的,因此不能和synchronized一致

 

5、ThreadLocal对象保证线程不共享

 

6、不用错误发布对象,尤其对象引用,导致不安全性,可以使用ConcurrentMap,SynchronizedMap,hashtable,vector,concurrentlinkedqueue,blockingqueue等线程安全的容器存放对象引用,它们会安全的将引用发布到其他线程中。

SynchronizedMap,Hashtable,ConcurrentHashMap差别见 http://vanadiumlin.iteye.com/blog/1201622

 

 

 

 

 

你可能感兴趣的:(多线程)