如果今天设计了Java:同步接口
Java已經(jīng)走了很長一段路。 很長的路要走。 它帶有早期設(shè)計決策中的所有“垃圾”。
一遍又一遍后悔的一件事是, 每個對象(可能)都包含一個監(jiān)視器 。 幾乎沒有必要這樣做,并且最終在Java 5中糾正了該缺陷,當(dāng)時引入了新的并發(fā)API,例如java.util.concurrent.locks.Lock及其子類型。 從那時起,編寫同步的并發(fā)代碼變得比以前容易得多,那時我們只有synchronized關(guān)鍵字以及難以理解的wait()和notify()機(jī)制:
同步修飾符幾乎不再使用
為這些方法上的“便捷”修飾符指定的原始語言設(shè)計:
// These are the same: public synchronized void method() {... }public void method() {synchronized (this) {...} }// So are these: public static synchronized void method() {... }public static void method() {synchronized (ClassOfMethod.class) {...} }您幾乎不想在整個方法范圍上進(jìn)行同步,以將同步時間保持在最短,并且每次需要同步時都將方法分解出來很乏味。
此外,監(jiān)視器破壞了封裝。 如果您在this class上或整個class上進(jìn)行同步,則每個人都可以在您的監(jiān)視器上進(jìn)行同步。 您可能不希望這樣做,這就是為什么大多數(shù)仍然使用synchronized關(guān)鍵字工作的人只會創(chuàng)建一個顯式的私有鎖對象,例如:
class SomeClass {private Object LOCK = new Object();public void method() {...synchronized (LOCK) {...}...} }如果這是經(jīng)典synchronized塊的標(biāo)準(zhǔn)用例,那么我們還需要每個對象上都有一個監(jiān)視器嗎?
在更現(xiàn)代的Java版本中同步
如果Java的設(shè)計與當(dāng)今的有關(guān)Java語言的知識,我們不會允許使用synchronized任何隨機(jī)對象(包括字符串或陣列)上:
// Wouldn't work synchronized ("abc") {... }我們將引入一個特殊的Synchronizable marker接口,以確保實現(xiàn)者將擁有一個監(jiān)視器。 并且synchronized塊將僅接受Synchronizable參數(shù):
Synchronizable lock = ...synchronized (lock) {... }這將與foreach或try-with-resources完全相同:
Iterable<Object> iterable = ...// The type to the right of ":" must be Iterable for (Object o : iterable) {... }// The assignment type must be AutoCloseable try (AutoCloseable closeable = ...) {... }// The assignment type must be a functional interface Runnable runnable = () -> {};因此,為了使給定的語言功能正常工作,Java語言對在該上下文中使用的類型施加了約束。 對于foreach或try-with-resources,需要一個具體的JDK類型。 在使用lambda表達(dá)式的情況下,需要匹配的結(jié)構(gòu)類型(對于Java來說,這是很深奧的,但是很聰明)。
不幸的是,出于向后兼容的原因,將不會為synchronized塊添加任何新的限制。 還是會嗎? 很好,如果類型不是Synchronizable則可能會發(fā)出可選警告。 在未來的幾個主要版本中,這可能允許從實際上不需要進(jìn)行同步的對象中刪除監(jiān)視器。
從本質(zhì)上講,C語言一直在使用互斥鎖。 他們是很特別的事情。 不常見。
翻譯自: https://www.javacodegeeks.com/2016/01/java-designed-today-synchronizable-interface.html
總結(jié)
以上是生活随笔為你收集整理的如果今天设计了Java:同步接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么要ddos攻击(ddos可以攻击4
- 下一篇: html5开发ria_用于RIA的Jav