併發安全 final關鍵字和不變性

2021-10-02 09:33:22 字數 2448 閱讀 2379

例子:person物件,age和name都不能再變

/**

* 不可變的物件,演示其他類無法修改這個物件,public也不行

*/public class person

}

具有不變性的物件一定是執行緒安全的,我們不需要對其採取任何額外的安全措施,也能保證執行緒安全 

早期

現在

final修飾變數

final修飾:3種變數

final修飾變數:賦值時機

賦值時機

finalinstancevariable(類中的final屬性)

/**

* 演示final變數

*/public class finalvariabledemo

//第三就是在類的初始**塊中賦值(不常用)

//}

finalstaticvariable(類中的static final屬性)

public class finalvariabledemo 

}

final local variable(方法中的final變數)

public class finalvariabledemo 

}

為什麼要規定賦值時機?

public class finalvariabledemo 

}

final修飾方法 

public class finalmethoddemo 

}

public class finalmethoddemo 

public final void eat()

public static void sleep()

}class subclass extends finalmethoddemo

//public final void eat()

//public void eat()

//可以寫乙個同名的方法:這一點和final方法不一樣

public static void sleep()

//public static void main(string args)

}

final修飾類

不變性並不意味著,簡單地用final修飾就是不可變

如何利用final實現物件不可變

總結:滿足以下條件時,物件才是不可變的

public class person 

}class testfinal

/**

* 乙個屬性是物件,但是整體不可變,其他類無法修改set裡面的資料

*/public class immutabledemo

public boolean isstudent(string name)

}

/**

* 演示棧封閉的兩種情況,基本變數和物件 先演示執行緒爭搶帶來錯誤結果,然後把變數放到方法內,情況就變了

*/public class stackconfinement implements runnable

//}system.out.println("棧內保護的數字是執行緒安全的:" + nevergoout);

}@override

public void run()

inthread();

}public static void main(string args) throws interruptedexception

}

public class finalstringdemo1 

}

public class finalstringdemo2 

public static void main(string args)

}

final關鍵字與不變性

類中的static final屬性則有兩種賦值時機,除了在宣告變數的等號右邊直接賦值,還可以用static初始 塊賦值,而不能用普通的初始化 塊賦值 在方法中的final變數,由於方法中並沒有建構函式,也沒有初始化 塊,所以不規定賦值時機,只要求在變數使用前必須賦值 描述 演示棧封閉的兩種情況,基本...

static關鍵字和final關鍵字

static記住幾點 1.優先順序高,載入優先物件例項化 2.在記憶體中只分配一次 3.屬於類本身,所有例項共享,一處變,處處變 4.1 static不能訪問沒有static修飾的方法 因為不認識,物件例項後才能在外部使用方法 2 可以訪問static塊 3 未加static的方法可以訪問stati...

abstract關鍵字和final關鍵字

abstract類和abstract方法 用關鍵字abstract修飾的類 方法 稱為abstract類 方法 抽象類,抽象方法。對於abstract方法,沒有方法體,且以 結尾,且不允許使用final和abstract同時修飾乙個類或者方法,因為被abstract修飾的話,就無法被繼承 abstr...