如果今天设计了Java:同步接口

Java已经走了很长一段路。 很长的路要走。 它带有早期设计决策中的所有“垃圾”。

一遍又一遍后悔的一件事是, 每个对象(可能)都包含一个监视器 。 几乎没有必要这样做,并且最终在Java 5中纠正了该缺陷,当时引入了新的并发API,例如java.util.concurrent.locks.Lock及其子类型。 从那时起,编写同步的并发代码变得比以前容易得多,那时我们只有synchronized关键字以及难以理解的wait()notify()机制:

同步修饰符几乎不再使用

为这些方法上的“便捷”修饰符指定的原始语言设计:

// 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) {...}
}

您几乎不想在整个方法范围上进行同步,以将同步时间保持在最短,并且每次需要同步时都将方法分解出来很乏味。

此外,监视器破坏了封装。 如果您在this class上或整个class上进行同步,则每个人都可以在您的监视器上进行同步。 您可能不希望这样做,这就是为什么大多数仍然使用synchronized关键字工作的人只会创建一个显式的私有锁对象,例如:

class SomeClass {private Object LOCK = new Object();public void method() {...synchronized (LOCK) {...}...}
}

如果这是经典synchronized块的标准用例,那么我们还需要每个对象上都有一个监视器吗?

在更现代的Java版本中同步

如果Java的设计与当今的有关Java语言的知识,我们不会允许使用synchronized任何随机对象(包括字符串或阵列)上:

// Wouldn't work
synchronized ("abc") {...
}

我们将引入一个特殊的Synchronizable marker接口,以确保实现者将拥有一个监视器。 并且synchronized块将仅接受Synchronizable参数:

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表达式的情况下,需要匹配的结构类型(对于Java来说,这是很深奥的,但是很聪明)。

不幸的是,出于向后兼容的原因,将不会为synchronized块添加任何新的限制。 还是会吗? 很好,如果类型不是Synchronizable则可能会发出可选警告。 在未来的几个主要版本中,这可能允许从实际上不需要进行同步的对象中删除监视器。

从本质上讲,C语言一直在使用互斥锁。 他们是很特别的事情。 不常见。

翻译自: https://www.javacodegeeks.com/2016/01/java-designed-today-synchronizable-interface.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单Map缓存

简单Map缓存/*** 部门代码对应的部门名称*/private static Map<String,String> mapBmmc new HashMap<String, String>();/*** 性别性别代码对应的性别名称*/private static Map<String,String> mapMc new HashMap<String, String>();/*** descriptio…

sw二次开发 python_基于C#的SolidWorks二次开发.doc

摘要&#xff1a;气动电阻点焊钳已经被各大汽车制造厂商广泛运的用于汽车焊接工艺中。它以无污染、压力稳定、动作敏捷等优点逐步替代了国内常见的液压传动焊钳&#xff0c;改变了液压传动滞缓的现象&#xff0c;从而达到了焊接循环的要求。本次毕业设计中&#xff0c;设计者使…

玩透个人所得税

每次拿着工资条的时候&#xff0c;总有个代扣个税这么一项&#xff0c;不知道你们有没有想过这到底是怎样计算得出来的。下面我就给你们普及一下这个知识。 个人所得税 个人所得税是对个人&#xff08;自然人&#xff09;取得的各项所得征收的一种所得税。个人所得税…

@Value和Hibernate问题

Value和Could not obtain transaction-synchronized Session for current thread1.说明 Value(“#{}”) 表示SpEl表达式通常用来获取bean的属性&#xff0c;或者调用bean的某个方法。当然还有可以表示常量。 2.出现的问题 Caused by: org.hibernate.HibernateException: Cou…

u32转换bool类型_4.29.类型转换

类型转换casting-between-types.mdcommit 6ba952020fbc91bad64be1ea0650bfba52e6aab4Rust&#xff0c;和它对安全的关注&#xff0c;提供了两种不同的在不同类型间转换的方式。第一个&#xff0c;as&#xff0c;用于安全转换。相反&#xff0c;transmute允许任意的转换&#xf…

用原生JS读写CSS样式的方法总结

一、可以通过DOM节点对象的style对象(即CSSStyleDeclaration对象)来读写文档元素的CSS样式如&#xff1a;var elm document.getElementById(test);elm.style.color black;二、通过Element对象的getAttribute()、setAttribute()、removeAttribute()直接读写style属性如&#x…

html5开发ria_用于RIA的JavaFX 2与HTML5

html5开发ria这些天来&#xff0c;我们正在启动一个新项目&#xff0c;以实现Rich Internet Application&#xff08;RIA&#xff09; 。 第一个问题是&#xff1a;我们应该使用哪些技术和框架&#xff1f; 后端将是Java或其他现代JVM语言&#xff0c;因为我们是经验丰富的Java…

js里面拼接代码和使用ModelAndView

js里面拼接代码和使用ModelAndView1.js里面拼接代码 <tr><td class"tdTitle">性别</td><td class"tdCont"><select name"yhxb" id"yhxb" class"inputSel" style"width: 100px"><…

哔哩哔哩swot分析_哔哩哔哩2020校园招聘游戏运营笔试真题

在前不久《英雄联盟》S9世界大赛总决赛上&#xff0c;中国FPX战队以3&#xff1a;0横扫欧洲G2最终夺得S9世界冠军&#xff0c;国内玩家万分激动。总决赛刚结束不久&#xff0c;B站以8亿元价格拍得《英雄联盟》全球总决赛中国地区三年独家直播版权。作为主打年轻人群体起家的产品…

P2280 [HNOI2003]激光炸弹

P2280 [HNOI2003]激光炸弹 题目描述 输入输出格式 输入格式&#xff1a;输入文件名为input.txt 输入文件的第一行为正整数n和正整数R&#xff0c;接下来的n行每行有3个正整数&#xff0c;分别表示 xi&#xff0c;yi &#xff0c;vi 。 输出格式&#xff1a;输出文件名为output.…

在Spring Boot中使用配置元数据来配置您的配置

Spring Boot 1.3.0中发布了许多更新&#xff0c;但是其中一个对我很突出&#xff0c;因为我以前并不了解此更新&#xff0c;它的状态使其成为一项真正有用的功能&#xff08;不幸的是&#xff0c;撰写本文时仅在Spring Boot中可用&#xff09;这个&#xff09;。 我正在谈论配置…

jsp实现数据禁用和只读

jsp实现数据禁用和只读

java事务不生效场景_讲一下,我最近帮忙面试的几个“高级”JAVA,真的心累

最近看了很多简历&#xff0c;很多候选人年限不小&#xff0c;但是想着也不能通过简历就直接否定一个人&#xff0c;何况现在大环境越来 越难&#xff0c;大家找工作也不容易&#xff0c;于是就打算见一见。在沟通中发现&#xff0c;由于年限不小&#xff0c;他们的定位基本都是…

.net:Code First 创建或更新数据库

控制台输入命令&#xff1a; 切换到项目的project.json 文件所在文件 dotnet ef migrations add XXX dotnet ef database update Visual Studio程序包管理器控制台&#xff1a; Add-Migration XXX Update-Database转载于:https://www.cnblogs.com/Cchblogs/p/7155781.html

jQuery实现数据映入form表单

jQuery实现数据映入form表单//显示用户信息 function show(type, yhdm) {return $.ajax({url: getUrlPath() /userManage / type,type: "POST",data: {"type": type, "yhdm": yhdm},dataType: json,success: function (data) {$(#yhid).val(d…

gin 生成api文档_gin-swagger 生成RESTful风格OpenAPI文档

&#x1f4dc;什么是swaggerSwagger 是一个 API 生成工具&#xff0c;可以生成文档。 Swagger 是通过编写 yaml 和 json 来实现文档化。并且可以进行测试等工作。通过 swagger 可以方便的生成接口文档&#xff0c;方便前端进行查看和测试。&#x1f527;安装 swagger在我们的项…

antlr 教程_ANTLR教程– Hello Word

antlr 教程Antlr代表另一种语言识别工具。 该工具能够为任何计算机语言生成编译器或解释器。 除了明显的用途&#xff08;例如需要解析一种真正的“大型”编程语言&#xff0c;例如Java&#xff0c;PHP或SQL&#xff09;外&#xff0c;它还可以帮助执行更小&#xff0c;更常见的…

VBA操作word生成sql语句

项目开始一般都是用word保存下数据库的文档 但是从表单一个一个的建表实在是很困难乏味&#xff0c;查查资料 1、可以生成一个html或者xml&#xff0c;检索结构生成sql。但是这个方式也蛮麻烦 2、查到vba可以操作word读取表格。所以采用这种方式写了一个小程序。这样就可以直接…

jQuery实现禁用和只读

jQuery实现禁用和只读<td class"tdTitle"><i class"required">*</i>用户ID</td><td class"tdCont"><input class"inputText noNull param" id"yhid" notNull"用户ID" name"…

idea 单独引入jar_Intellij IDEA 添加jar包的三种方式

一.直接复制&#xff1a;(不推荐)方法&#xff1a;直接将硬盘上的jar包复制粘贴到项目的lib目录下即可。注意&#xff1a;1.对于导入的eclipse项目&#xff0c;该方式添加的jar包没有任何反应&#xff0c;用make编译项目会报错2.对于在idea中创建的项目&#xff0c;该方式添加j…