• 软件:1711
  • 资讯:51514|
  • 收录网站:99622|

IT精英团

你知道用Java创建对象的方法吗?赢得了成千上万的赞誉

你知道用Java创建对象的方法吗?赢得了成千上万的赞誉

浏览次数:
评论次数:
编辑: 温瑜
信息来源: 51CTO博客
更新日期: 2021-07-06 21:51:21
摘要

你知道Java有哪些创建对象的方式吗?已获万赞,你知道Java有哪些创建对象的方式吗?已获万赞

  • 资讯详情
# #并发模型与分布式系统非常相似 事实上,并发模型与分布式系统模型非常相似,在分布式系统模型中,线程之间相互通信,但在分布式系统模型中,线程之间相互通信。`流程'?互相交流。然而,进程和线程在本质上也非常相似。这就是为什么并发模型与分布式模型非常相似。 分布式系统通常比并发系统面临更多的挑战和问题,如进程通信、可能的网络异常或远程机器故障等。然而,并发模式也面临着CPU故障、网卡问题、硬盘问题等问题。 因为并发模型类似于分布式模型,所以它们可以互相学习。例如,用于线程分配的模型类似于分布式系统环境中的负载平衡模型。 其实说白了,分布式模型的思想就是从并发模型衍生出来的。 # #识别两种状态 并发模型的一个重要方面是线程应该处于“共享状态”,应该是“共享状态”还是“独立状态”。共享状态意味着在不同的线程之间共享某种状态 状态实际上是“数据”,例如一个或多个对象。当线程想要共享数据时,会导致?“竞争条件”?还是?“僵局”?等等。当然,这些问题可能只会出现,具体的实现取决于您是否安全地使用和访问共享对象。 ![](https://s 2.51 CTO.com/images/20210706/1625520609518917 . jpg) 独立状态表示该状态不会在多个线程之间共享。如果线程需要通信,它们可以访问不可变的对象来实现它。这是避免并发问题的最有效方法,如下图所示 ![](https://s 2.51 CTO.com/images/20210706/1625520609651826 . jpg) 使用独立状态使我们的设计更容易,因为只有一个线程可以访问对象,即使对象被交换,它也是不可变的。 # #并发模型 # # #平行工人 第一个并发模型是并行工作者模型,在这个模型中,客户机将把任务交给?“委派”,然后委派者将工作分配给不同的人?工人。如下图所示 ![](https://s 2.51 CTO.com/images/20210706/1625520609319468 . jpg) 并行Worker的核心思想是它主要有两个过程,即代理和工作者。委托人负责从客户那里接收任务,并将其分配给特定的工作人员进行处理。工人完成处理后,将结果返回给委托者。委托者收到工作人员处理的结果后,会进行汇总,然后交给客户。 并行工作者模型是Java并发模型中非常常见的模型。很多?` java.util.concurrent `?包下的所有并发工具都使用这个模型。 # # # #平行工作者的优势 并行Worker模型的一个非常明显的特征是它很容易理解。为了提高系统的并行性,可以增加更多的工作人员来完成任务。 并行Worker模型的另一个优点是,它将一个任务分成几个小任务,并同时执行它们。委托者收到工作者的处理结果后会返回给客户端,工作者-委托者-客户端的整个过程是“异步”的。 # # # #平行工人的缺点 同样,并行Worker模式也有一些隐藏的缺点 * *共享状态变得复杂* * 实际的并行工作者比我们图中所示的更复杂,主要是因为并行工作者通常访问内存或共享数据库中的一些共享数据。 ![](https://s 2.51 CTO.com/images/20210706/1625520609810324 . jpg) 这些共享状态可能使用一些工作队列来保存业务数据、数据缓存、数据库连接池等。在线程通信中,线程需要保证共享状态是否可以被其他线程共享,而不是仅仅停留在CPU缓存中,让自己可以使用。当然,这些都是程序员在设计时需要考虑的问题。线程需要避免?比赛状态,僵局?和许多其他共享州。 多线程在访问共享数据时会失去并发性,因为操作系统要保证只有一个线程可以访问数据,这会导致共享数据的争用和抢占。不抢占资源的线程会吗?“阻塞”。 现代非阻塞并发算法可以减少争用,提高性能,但非阻塞算法难以实现。 持久数据结构?是另一种选择。持久数据结构总是在修改后保留以前的版本。因此,如果多个线程同时修改一个持久数据结构,并且一个线程修改它,修改后的线程将获得对新数据结构的引用。 虽然持久化数据结构是一种新的解决方案,但在实现中存在一些问题。例如,持久列表会在列表的开头添加新元素,并返回添加新元素的引用,但其他线程仍然只持有列表中前一个第一个元素的引用,并且看不到新添加的元素。 持久性数据结构,例如?链接列表?硬件性能表现不佳。列表中的每个元素都是一个对象,这些对象分散在计算机内存中。现代CPU的顺序访问通常要快得多,因此可以通过使用数组等顺序访问数据结构来实现更高的性能。CPU缓存可以将一个大的矩阵块加载到缓存中,加载后让CPU直接访问CPU缓存中的数据。对于链表,实际上不可能将元素分散在整个内存中。 **无状态的 worker** 共享状态可以由其他线程所修改,因此,worker 必须在每次操作共享状态时重新读取,以确保在副本上能够正确工作。不在线程内部保持状态的 worker 成为无状态的 worker。 **作业顺序是不确定的** 并行工作模型的另一个缺点是作业的顺序不确定,无法保证首先执行或最后执行哪些作业。任务 A 在任务 B 之前分配给 worker,但是任务 B 可能在任务 A 之前执行。 ### 流水线 第二种并发模型就是我们经常在生产车间遇到的?`流水线并发模型`,下面是流水线设计模型的流程图 ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/thmcwf5nx11.jpg) 这种组织架构就像是工厂中装配线中的 worker,每个 worker 只完成全部工作的一部分,完成一部分后,worker 会将工作转发给下一个 worker。 每道程序都在自己的线程中运行,彼此之间不会共享状态,这种模型也被称为无共享并发模型。 使用流水线并发模型通常被设计为`非阻塞I/O`,也就是说,当没有给 worker 分配任务时,worker 会做其他工作。非阻塞I/O 意味着当 worker 开始 I/O 操作,例如从网络中读取文件,worker 不会等待 I/O 调用完成。因为 I/O 操作很慢,所以等待 I/O 非常耗费时间。在等待 I/O 的同时,CPU 可以做其他事情,I/O 操作完成后的结果将传递给下一个 worker。下面是非阻塞 I/O 的流程图 ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/xbjta0uz1af.jpg) 在实际情况中,任务通常不会按着一条装配线流动,由于大多数程序需要做很多事情,因此需要根据完成的不同工作在不同的 worker 之间流动,如下图所示 ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/kojteztesan.jpg) 任务还可能需要多个 worker 共同参与完成 ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/jnwwdy0nz1g.jpg) #### 响应式 - 事件驱动系统 使用流水线模型的系统有时也被称为?`响应式`?或者?`事件驱动系统`,这种模型会根据外部的事件作出响应,事件可能是某个 HTTP 请求或者某个文件完成加载到内存中。 #### Actor 模型 在 Actor 模型中,每一个 Actor 其实就是一个 Worker, 每一个 Actor 都能够处理任务。 简单来说,Actor 模型是一个并发模型,它定义了一系列系统组件应该如何动作和交互的通用规则,最著名的使用这套规则的编程语言是 Erlang。一个参与者`Actor`对接收到的消息做出响应,然后可以创建出更多的 Actor 或发送更多的消息,同时准备接收下一条消息。 ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/ifnxswyqhmn.jpg) #### Channels 模型 在 Channel 模型中,worker 通常不会直接通信,与此相对的,他们通常将事件发送到不同的?`通道(Channel)`上,然后其他 worker 可以在这些通道上获取消息,下面是 Channel 的模型图 ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/nmuhfgyuyer.jpg) 有的时候 worker 不需要明确知道接下来的 worker 是谁,他们只需要将作者写入通道中,监听 Channel 的 worker 可以订阅或者取消订阅,这种方式降低了 worker 和 worker 之间的耦合性。 #### 流水线设计的优点 与并行设计模型相比,流水线模型具有一些优势,具体优势如下 **不会存在共享状态** 因为流水线设计能够保证 worker 在处理完成后再传递给下一个 worker,所以 worker 与 worker 之间不需要共享任何状态,也就不用无需考虑以为并发而引起的并发问题。你甚至可以在实现上把每个 worker 看成是单线程的一种。 **有状态 worker** 因为 worker 知道没有其他线程修改自身的数据,所以流水线设计中的 worker 是有状态的,有状态的意思是他们可以将需要操作的数据保留在内存中,有状态通常比无状态更快。 **更好的硬件整合** 因为你可以把流水线看成是单线程的,而单线程的工作优势在于它能够和硬件的工作方式相同。因为有状态的 worker 通常在 CPU 中缓存数据,这样可以更快地访问缓存的数据。 **使任务更加有效的进行** 可以对流水线并发模型中的任务进行排序,一般用来日志的写入和恢复。 #### 流水线设计的缺点 流水线并发模型的缺点是任务会涉及多个 worker,因此可能会分散在项目代码的多个类中。因此很难确定每个 worker 都在执行哪个任务。流水线的代码编写也比较困难,设计许多嵌套回调处理程序的代码通常被称为?`回调地狱`。回调地狱很难追踪 debug。 ## 函数性并行 函数性并行模型是最近才提出的一种并发模型,它的基本思路是使用函数调用来实现。消息的传递就相当于是函数的调用。传递给函数的参数都会被拷贝,因此在函数之外的任何实体都无法操纵函数内的数据。这使得函数执行类似于`原子`操作。每个函数调用都可以独立于任何其他函数调用执行。 当每个函数调用独立执行时,每个函数都可以在单独的 CPU 上执行。这也就是说,函数式并行并行相当于是各个 CPU 单独执行各自的任务。 JDK 1.7 中的?`ForkAndJoinPool`?类就实现了函数性并行的功能。Java 8 提出了 stream 的概念,使用并行流也能够实现大量集合的迭代。 函数性并行的难点是要知道函数的调用流程以及哪些 CPU 执行了哪些函数,跨 CPU 函数调用会带来额外的开销。 # 知其然不知其所以然,大厂常问面试技术如何复习? **1、热门面试题及答案大全** 面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer > [**面试宝典+书籍+核心知识获取:戳这里免费下载**](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)!诚意满满!!! ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/0ontiyjplkm.jpg) **2、多线程、高并发、缓存入门到实战项目pdf书籍** ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/s3hbbffbxe0.jpg) ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/lonthr3rqvk.jpg) ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/vzxl1uqxpko.jpg) **3、文中提到面试题答案整理** ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/zipgkt25y45.jpg) **4、Java核心知识面试宝典** 覆盖了**JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入** ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/cb21zjblrne.jpg) ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/cebulgugygy.jpg) ![](//img1-itnpc.oss-cn-hangzhou.aliyuncs.com/upload_img/202107/vwaktyom01j.jpg)
你还不确定分布式系统的流量控制和融合吗?瞬间长高!
« 上一篇
你的技能真的达到上限了吗?整理学习路线的知识点
下一篇 »
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
你会是第一个来这里评论的人吗?