在开发中,对同一资源的访问需要考虑同步的问题,但是同步的使用需要慎重,过多的使用同步往往会降低性能,甚至有可能发生死锁,其实同步只是在复杂的情况下不得已而为之的一种办法。
在使用同步的时候要考虑两个问题:1.是不是一定要使用同步 2.被访问的资源是否属于原子型的
在一些特定的情况下,多线程访问同一个资源是不需要同步的,比如读取操作,针对方法内局部变量的写操作也不需要同步,同步的关键在于类变量的访问操作,一旦设置了类变量,那么就要考虑同步。根据banq的资料,整理如下:
public class Test {
private int state;
private volatile long stateLong;
private byte[] states = null;
private String stateStrs = null;
private final Object stateObject = null;
private HashMap map = new HashMap;
private Hashtable hashTable = new Hashtable;
public void setState(int state) {
this.state = this.state + state;
}
...
}
在上面的Test类中,有5个类变量,分别代表5中不同的类变量: