当前位置: 首页 > 科技观察

Java和Go在并发实现上的区别

时间:2023-03-19 14:23:15 科技观察

一直想讨论一下Golang和Java,很多小伙伴也想讨论一下。而我碰巧对Java编程语言有相当多的经验,在过去的几年里,我接触并使用了Golang。Java是一种高级编程语言,它使用对象方法来实现其语言。Java是一种非常成熟和稳定的编程语言,在世界上使用最广泛。特别是在企业级,平均超过80%的应用程序使用Java。Java本身是在1990年左右由SUNMicrosystems开发的。Golang是Google创建的编程语言,2009年左右开源。Golang最初是用C实现的。它和Java一样有垃圾回收机制,不同的是Golang代码会被编译成计算机的本机代码,因此相比之下会有更好的性能。基于虚拟机的编程语言。Golang几乎像Java一样的OOP,但它不是完全的OOP,或者说还不能称为完全的OOP编程语言。由于缺乏对OOP的支持,某些功能可能会很麻烦。但是面向对象有它自己的问题。Go强调重用而不是组合而不是继承。并发是一种编程技术,用于解决多个请求或多个进程同时完成的问题。并发进程的主要特点是一个进程和另一个进程不能同时在某个资源上执行。通常一个过程与另一个过程交替进行。因为速度太快了,所以有时候看起来好像是一起完成的。如果我们尝试分析,这个并发过程就像一个餐厅工作人员处理许多请求。他会将所有收到的请求堆积起来,一一完成。这样,如果所有的进程都自己执行,那么进程会耗费很长时间,因为会发生排队,那些worker会被耗尽。为了处理这么多请求,解决方案是添加额外的工作人员,以便可以同时执行工作流并更快地满足访客请求。它不同于并行概念,后者有时与并发概念相混淆。并行处理是解决大问题的一种方法,通常需要很长时间才能完成。通过将其分解成更小的部分来完成解决方案。这些小任务是独立的,互不影响,同时完成。在并行编程技术中,并发是必然存在的,但并发并不一定意味着并行进程的存在。并发和并行之间的区别Java使用OS线程通过Java运行时管理的线程来完成并行过程。Golang通过Goroutine使用threados来完成并行过程。在Java和Golang的并行概念上,并没有太大区别,几乎相同,只是叫法不同而已。并发的概念是不同的。在Java中,这是通过将Java运行时线程映射到操作系统线程来完成的。同时golang通过这个goroutine映射到golang上的scheduler,映射到更深层次。Goroutines本身不是线程系统或由os线程管理的线程。然而,这个想法更像是一个多路复用器,它将函数协程处理到操作系统线程中。这样,当一个进程阻塞发生时,它将被移动到一个未使用的线程或一个绿色线程,而Go调度器的工作是将这个绿色线程映射到一个OS线程,并将goroutines分配给空闲的绿色线程。乍一看,goroutine的概念和React.io中Reactore3或者RxJava中表达的ReactJava的非阻塞概念几乎是一样的。但是,JavaReactiveStreams概念具有比goroutines更高级的方法。Java并发模型和Golang的模型几乎一样,只是在并发问题上有不同的实现。异步进程Java创建从Thread类扩展的类。实现可运行接口。GolangGoroutine在同步进程Java方法上启动同步块。使用java.util.concurrent包中的Lock.ReentrantLockGolang使用通道的概念,这是术语“无需共享内存的通信和通过通信共享内存”的术语的实现。Sync.Mutex锁定资源。Java中的进程间通信使用object.wait()、object.Notify()或object.NotifyAll()方法。在多个线程线程享块队享块队享块队列使用使用列和和golang方法golang方法waitgroup使用waitgroup样例sampletask.javapackagecom.dhfr.concurrency;importjava;importjava.util.util.concurrent.concurrent.concurrent.timeunit;uplucclasssmpletaskimplementstrimentneentneentneentneentnerneentnernentring=名称;}publicStringgetName(){returnname;}publicvoidrun(){LongtimeDuration=(long)Math.random()*11;System.out.println("PengerjaanTask"+name);try{TimeUnit.SECONDS.sleep(timeDuration);}catch(InterruptedExceptione){e.printStackTrace();}}}ApplicationMain.javapackagecom.dhfr.concurrency;importjava.util.concurrent.Executors;importjava.util.concurrent.ThreadPoolExecutor;publicclassApplicationMain{publicstaticvoidmain(String[]args){ThreadPoolExecutorthreadPoolExecutor=(ThreadPoolExecutor)Executors.newFixedThreadPool(6);for(inti=0;i<10;i++){SampleTasksampleTask=newSampleTask("Taskke"+i);System.out.println("Sebuahtasksudahditanbahkandengannama"+sampleTask.getName());threadPoolExecutor.execute(sampleTask);}System.out.println("Maksimunthreadyangterjadiadalah"+threadPoolExecutor.getMaximumPoolSize());threadPoolExecutor.shutdown();}}viewraw如果我们执行上面的代码,会产生以下输出:从上面代码的输出可以看出,由于提供的线程数是6,所以进程是异步执行的比如我们创建一个1的线程池,结果总会是这样的。SebuahtasksudahditambahkandengannamaTaskke0SebuahtasksudahditambahkandengannamaTaskke1SebuahtasksudahditambahkandengannamaTaskke2SebuahtasksudahditambahkandengannamaTaskke3SebuahtasksudahditambahkandengannamaTaskke4SebuahtasksudahditambahkandengannamaTaskke5SebuahtasksudahditambahkandengannamaTaskke6SebuahtasksudahditambahkandengannamaTaskke7SebuahtasksudahditambahkandengannamaTaskke8SebuahtasksudahditambahkandengannamaTaskke9Maksimunthreadyangterjadiadalah1PengerjaanTaskTaskke0PengerjaanTaskTaskke1PengerjaanTaskTaskke2PengerjaanTaskTaskke3PengerjaanTaskTaskke4PengerjaanTaskTaskke5PengerjaanTaskTaskke6PengerjaanTaskTaskke7PengerjaanTaskTaskke8PengerjaanTaskTaskke9Processfinishedwithexitcode0因为只有1个池可用,所以该过程是同步完成的。main.gopackagemainimport("fmt""runtime")funcmain(){numberOfCPU:=runtime.NumCPU()runtime.GOMAXPROCS(numberOfCPU)/*Jumlahbilanganprimayangakandigenerate*/constmaxNumber=30ch:=make(chanint)deferclose(ch)goGenerate(ch)fori:=0;i