Synchronized
如果不希望被打断,就用synchronized的括起来。
注意:
(1)Synchronized 一定使用在一个方法中。
(2)锁标记是对象的概念,加锁是对对象加锁,目的是在线程之间进行协调。
(3)当用Synchronized 修饰某个方法的时候,表示该方法都对当前对象加锁。
(4)给方法加Synchronized 和用Synchronized 修饰对象的效果是一致的。
(5)一个线程可以拿到多个锁标记,一个对象最多只能将monitor 给一个线程。
(6)不能加synchronized:
构造方法:对象都没有 当然不能加synchronized
抽象方法:
因为同步的方法持有的锁,是this,
而抽象类不能被实例化,也就不存在这个抽象类的对象this。
但抽象类的抽象方法必须在其子类被实现,
而子类(此子类不是抽象类)可以将这个在父类定义的抽象方法声明为同步的,
这也正好符合 抽象方法 把具体实现放到子类来实现的思想。
(7)一般方法和静态方法可以加synchronized同步。
(8)Synchronized 是以牺牲程序运行的效率为代价的,因此应该尽量控制互斥代码块的范围。
(9)方法的Synchronized 特性本身不会被继承,只能覆盖。
通过Synchronized,可知Vector 较ArrayList 方法的区别就是Vector 所有的方法都有
Synchronized。所以Vector 更为安全。
同样:Hashtable 较HashMap 也是如此。
StringBuffer vs StringBuilder
StringBuffer:线程安全
StringBuilder:非线程安全
ArrayList:非线程安全
Vector:线程安全(方法全是同步的)
如果想ArrayList也同步:
就要使用:java.util.Collections工具类
copy()集合拷贝
reverse()集合翻转
sort()结合比较器排序
synchronizedXXX() 可以完成同步
List list = new ArrayList();
list = Collections.synchronizedList( list );
//些时list变为了(外)同步的list了。