我在很多代碼中都看到這樣的問題
public class A{
public A(){
this
this
this
this
}
}
這個會引起什麼問題呢?如果有個類B繼承了類A
解決這個問題有兩個辦法
都知道對一個變量同步的有效方式是用synchronized保護起來
class A{
int x;
public int getX(){
return x;
}
public synchronized void setX(int x)
{
this
}
}
x的setter方法有同步
這也是很常見的錯誤
synchronized(array[
{
array[
}
同步塊使用array[
wait和notify用於實現條件變量
synchronized(lock)
{
if(isEmpty()
lock
}
對條件的判斷是使用if
synchronized(lock)
{
while(isEmpty()
lock
}
沒有進行條件判斷就調用wait的情況更嚴重
同步的范圍過小
Map map=Collections
if(!ntainsKey(
map
}
這是一個很典型的錯誤
Map map = Collections
synchronized (map) {
if (!ntainsKey(
map
}
}
注意
同步范圍過大的例子也很多
在jdk
volatile可以用來做什麼?
private volatile boolean stopped;
public void close(){
stopped=true;
}
public void run(){
while(!stopped){
//do something
}
}
前提是do something中不會有阻塞調用之類
private volatile IoBufferAllocator instance;
public IoBufferAllocator getInsntace(){
if(instance==null){
synchronized (IoBufferAllocator
if(instance==null)
instance=new IoBufferAllocator();
}
}
return instance;
}
public class CheesyCounter {
private volatile int value;
public int getValue() { return value; }
public synchronized int increment() {
return value++;
}
}
synchronized保證更新的原子性
volatile不能用於做什麼?
public class CheesyCounter {
private volatile int value;
public int getValue() { return value; }
public int increment() {
return value++;
}
}
因為value++其實是有三個操作組成的
一個典型的例子是定義一個數據范圍
public class NumberRange {
private volatile int lower
public int getLower() { return lower; }
public int getUpper() { return upper; }
public void setLower(int value) {
if (value > upper)
throw new IllegalArgumentException();
lower = value;
}
public void setUpper(int value) {
if (value < lower)
throw new IllegalArgumentException();
upper = value;
}
}
盡管講lower和upper聲明為volatile
public class NumberRange {
private volatile int lower
public int getLower() { return lower; }
public int getUpper() { return upper; }
public synchronized void setLower(int value) {
if (value > upper)
throw new IllegalArgumentException();
lower = value;
}
public synchronized void setUpper(int value) {
if (value < lower)
throw new IllegalArgumentException();
upper = value;
}
}
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27292.html