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

如果今天设计了Java:同步接口相关推荐

  1. 【后端-接口设计】java应用接口授权鉴权与URL防篡改详细设计

    目录 一.背景 二.设计方案 三.详细设计 1. 新增配置项 2. 新增接口授权管理页面 3. 接口授权过滤 4. URL防篡改支持 5. 对系统SDK请求授权支持 6. 数据库设计 7. 接口设计 ...

  2. java同步接口和异步接口_同步接口和异步接口

    定义 答案:来自网络搜索 同步调用:当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果.但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用; 异步调用:同步请求参数里面会有一个回 ...

  3. java异步接口转同步接口_如果今天设计了Java:同步接口

    java异步接口转同步接口 Java已经走了很长一段路. 很长的路要走. 它带有早期设计决策中的所有"垃圾". 一遍又一遍后悔的一件事是, 每个对象(可能)都包含一个监视器 . 几 ...

  4. Java面向接口编程,低耦合高内聚的设计哲学

    接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...

  5. 对接京东获取任务工单接口jingdong.homefw.task.search,附接口字段详细说明,数据库设计,Java实现

    目录 接口详细说明 jingdong.homefw.task.search(获取任务工单) 任务工单字段详细说明 数据库设计 任务工单表结构 日志表结构 接口Java实现 接口详细说明 jingdon ...

  6. Java基础 接口实现 设计一个形状类(接口)Shape,方法:求周长和求面积

    题目: 设计一个形状类(接口)Shape,方法:求周长和求面积形状类(接口)的子类(实现类);:Rect(矩形),Circle(圆形)Rect类的子类:Square(正方形)不同的子类会有不同的计算周 ...

  7. 死磕 java同步系列之ReentrantReadWriteLock源码解析

    问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...

  8. 内部同步 外部同步 java_如何用匿名内部类实现 Java 同步回调

    在一个应用系统中,不论使用何种编程语言,模块之间要进行调用,仅存在三种方式:同步调用.异步调用.回调.本文就其中回调方式进行详细解读,并通过匿名内部类的手段,在最后实现一个同步回调的过程. 一.回调的 ...

  9. Java同步组件之CyclicBarrier,ReentrantLock

    文章目录 Java同步组件概况 `CyclicBarrier`介绍 与`CountDownLatch`比较 相同点 不同点 `CountDownLatch`和`CyclicBarrier`的场景比较 ...

  10. java private 接口_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

最新文章

  1. 活动图与流程图的区别
  2. CloudFoundry Service 使用
  3. Linux 进程内 全局看见,Android获得全局进程信息以及进程使用的内存情况
  4. Windows Server 笔记之备份与灾难恢复
  5. 中职计算机说课稿三篇,精选中职计算机说课稿三篇-20210609060707.docx-原创力文档...
  6. MyBatis : Example 条件查询 in 用法
  7. 计算机名生成,如何让输出的文本名字自动生成计算机名字?
  8. PHP代码猜数字游戏,js实现一个猜数字游戏
  9. CentOS6编译装载nbd模块
  10. gradle 失败 编译项目_ElasticSearch编译时如何选择Gradle版本?
  11. 一条拼了40min的hql引发的思考
  12. 【DL小结5】Transformer模型与self attention
  13. Linux 多点电容触摸屏实验(1)
  14. 限制input 输入框只能输入数字
  15. P1036 [NOIP2002 普及组] 选数
  16. 软件定义网络实验之SDN网络简单管理及开发
  17. 关于ppt无法添加页码的解决办法
  18. 网络视频无法快进无法选中进度条
  19. day5 安装Linux服务器面板管理工具
  20. 海思4G远程视频监控——4G插卡全网通远程监控摄像头——WiFi插卡摄像头开发板

热门文章

  1. Java中的宏变量,宏替换详解。
  2. @Controller,@Service,@Repository,@Component详解
  3. Java Jar包的压缩、解压使用指南
  4. java实现人脸识别源码【含测试效果图】——ServiceImpl层(UserServiceImpl)
  5. 第3步 (请先看第2步再看第3步) 新建完spring+springmvc+mybatis项目 需要推送gitee仓库进行管理 巨详细
  6. MySQL的source命令不加分号和delimiter的使用
  7. Redis两种客户端:lettuce和Jedis的区别
  8. aws生态系统集成商_通过通用数据访问扩展AWS生态系统
  9. jep290涉及jdk版本_针对JDK 14提议的另外六个JEP
  10. jtable隐藏全部_全部隐藏!