Ⅰ java-JAVA中都有哪幾種分布式實現方式,各有什麼優缺點
常用的有EJB、rmi、Web Service,還有Hessian、NIO等,它們的優缺點比較比下:
1:EJB
優勢:可擴回展性好,安全性強,答支持分布式事務處理。
劣勢:不能跨語言;配置相對復雜,不同J2EE容器之間很難做無縫遷移。
2:rmi
優勢:面向對象的遠程服務模型;基於TCP協議上的服務,執行速度快。
劣勢:不能跨語言;每個遠程對象都要綁定埠,不易維護;不支持分布式事務JTA,RMI框架對於安全性、事務、可擴展性的支持非常有限。
3: Web Service
優勢:跨語言、跨平台,SOA思想的實現;安全性高;可以用來兼容legacy系統的功能
劣勢:性能相對差,不支持兩階段事務
4:Hessian
優勢:使用簡單,速度快;跨語言,跨平台;可以用來兼容legacy系統的功能。
劣勢:安全性的支持不夠強,不支持兩階段事務。
5:NIO(Mina/Netty)
優點:基於TCP通信,效率上高於HTTP的方式,非阻塞IO應對高並發綽綽有餘。根據具體的需要制定數據傳輸的格式,可擴展性強。
缺點:不能跨語言,無法穿透防火牆。
Ⅱ Java分布式系統處理分布式事務有哪些經典解決方
當我們在生產線上用一台伺服器來提供數據服務的時候,我會遇到如下的兩個問題:
1)一台伺服器的性能不足以提供足夠的能力服務於所有的網路請求。
2)我們總是害怕我們的這台伺服器停機,造成服務不可用或是數據丟失。
於是我們不得不對我們的伺服器進行擴展,加入更多的機器來分擔性能上的問題,以及來解決單點故障問題。 通常,我們會通過兩種手段來擴展我們的數據服務:
1)數據分區:就是把數據分塊放在不同的伺服器上(如:uid % 16,一致性哈希等)。
2)數據鏡像:讓所有的伺服器都有相同的數據,提供相當的服務。
對於第一種情況,我們無法解決數據丟失的問題,單台伺服器出問題時,會有部分數據丟失。所以,數據服務的高可用性只能通過第二種方法來完成——數據的冗餘存儲(一般工業界認為比較安全的備份數應該是3份,如:Hadoop和Dynamo)。 但是,加入更多的機器,會讓我們的數據服務變得很復雜,尤其是跨伺服器的事務處理,也就是跨伺服器的數據一致性。這個是一個很難的問題。 讓我們用最經典的Use Case:「A帳號向B帳號匯錢」來說明一下,熟悉RDBMS事務的都知道從帳號A到帳號B需要6個操作:
從A帳號中把余額讀出來。
對A帳號做減法操作。
把結果寫回A帳號中。
從B帳號中把余額讀出來。
對B帳號做加法操作。
把結果寫回B帳號中。
為了數據的一致性,這6件事,要麼都成功做完,要麼都不成功,而且這個操作的過程中,對A、B帳號的其它訪問必需鎖死,所謂鎖死就是要排除其它的讀寫操作,不然會有臟數據的問題,這就是事務。那麼,我們在加入了更多的機器後,這個事情會變得復雜起來:
1)在數據分區的方案中:如果A帳號和B帳號的數據不在同一台伺服器上怎麼辦?我們需要一個跨機器的事務處理。也就是說,如果A的扣錢成功了,但B的加錢不成功,我們還要把A的操作給回滾回去。這在跨機器的情況下,就變得比較復雜了。
2)在數據鏡像的方案中:A帳號和B帳號間的匯款是可以在一台機器上完成的,但是別忘了我們有多台機器存在A帳號和B帳號的副本。如果對A帳號的匯錢有兩個並發操作(要匯給B和C),這兩個操作發生在不同的兩台伺服器上怎麼辦?也就是說,在數據鏡像中,在不同的伺服器上對同一個數據的寫操作怎麼保證其一致性,保證數據不沖突?
同時,我們還要考慮性能的因素,如果不考慮性能的話,事務得到保證並不困難,系統慢一點就行了。除了考慮性能外,我們還要考慮可用性,也就是說,一台機器沒了,數據不丟失,服務可由別的機器繼續提供。 於是,我們需要重點考慮下面的這么幾個情況:
1)容災:數據不丟、節點的Failover
2)數據的一致性:事務處理
3)性能:吞吐量 、 響應時間
前面說過,要解決數據不丟,只能通過數據冗餘的方法,就算是數據分區,每個區也需要進行數據冗餘處理。這就是數據副本:當出現某個節點的數據丟失時可以從副本讀到,數據副本是分布式系統解決數據丟失異常的唯一手段。所以,在這篇文章中,簡單起見,我們只討論在數據冗餘情況下考慮數據的一致性和性能的問題。簡單說來:
1)要想讓數據有高可用性,就得寫多份數據。
2)寫多份的問題會導致數據一致性的問題。
3)數據一致性的問題又會引發性能問題
這就是軟體開發,按下了葫蘆起了瓢。
一致性模型
說起數據一致性來說,簡單說有三種類型(當然,如果細分的話,還有很多一致性模型,如:順序一致性,FIFO一致性,會話一致性,單讀一致性,單寫一致性,但為了本文的簡單易讀,我只說下面三種):
1)Weak 弱一致性:當你寫入一個新值後,讀操作在數據副本上可能讀出來,也可能讀不出來。比如:某些cache系統,網路游戲其它玩家的數據和你沒什麼關系,VOIP這樣的系統,或是網路搜索引擎(呵呵)。
2)Eventually 最終一致性:當你寫入一個新值後,有可能讀不出來,但在某個時間窗口之後保證最終能讀出來。比如:DNS,電子郵件、Amazon S3,Google搜索引擎這樣的系統。
3)Strong 強一致性:新的數據一旦寫入,在任意副本任意時刻都能讀到新值。比如:文件系統,RDBMS,Azure Table都是強一致性的。
從這三種一致型的模型上來說,我們可以看到,Weak和Eventually一般來說是非同步冗餘的,而Strong一般來說是同步冗餘的,非同步的通常意味著更好的性能,但也意味著更復雜的狀態控制。同步意味著簡單,但也意味著性能下降。 好,讓我們由淺入深,一步一步地來看有哪些技術:
Master-Slave
首先是Master-Slave結構,對於這種加構,Slave一般是Master的備份。在這樣的系統中,一般是如下設計的:
1)讀寫請求都由Master負責。
2)寫請求寫到Master上後,由Master同步到Slave上。
從Master同步到Slave上,你可以使用非同步,也可以使用同步,可以使用Master來push,也可以使用Slave來pull。 通常來說是Slave來周期性的pull,所以,是最終一致性。這個設計的問題是,如果Master在pull周期內垮掉了,那麼會導致這個時間片內的數據丟失。如果你不想讓數據丟掉,Slave只能成為Read-Only的方式等Master恢復。
當然,如果你可以容忍數據丟掉的話,你可以馬上讓Slave代替Master工作(對於只負責計算的節點來說,沒有數據一致性和數據丟失的問題,Master-Slave的方式就可以解決單點問題了) 當然,Master Slave也可以是強一致性的, 比如:當我們寫Master的時候,Master負責先寫自己,等成功後,再寫Slave,兩者都成功後返回成功,整個過程是同步的,如果寫Slave失敗了,那麼兩種方法,一種是標記Slave不可用報錯並繼續服務(等Slave恢復後同步Master的數據,可以有多個Slave,這樣少一個,還有備份,就像前面說的寫三份那樣),另一種是回滾自己並返回寫失敗。(註:一般不先寫Slave,因為如果寫Master自己失敗後,還要回滾Slave,此時如果回滾Slave失敗,就得手工訂正數據了)你可以看到,如果Master-Slave需要做成強一致性有多復雜。
Master-Master
Master-Master,又叫Multi-master,是指一個系統存在兩個或多個Master,每個Master都提供read-write服務。這個模型是Master-Slave的加強版,數據間同步一般是通過Master間的非同步完成,所以是最終一致性。 Master-Master的好處是,一台Master掛了,別的Master可以正常做讀寫服務,他和Master-Slave一樣,當數據沒有被復制到別的Master上時,數據會丟失。很多資料庫都支持Master-Master的Replication的機制。
另外,如果多個Master對同一個數據進行修改的時候,這個模型的惡夢就出現了——對數據間的沖突合並,這並不是一件容易的事情。看看Dynamo的Vector Clock的設計(記錄數據的版本號和修改者)就知道這個事並不那麼簡單,而且Dynamo對數據沖突這個事是交給用戶自己搞的。就像我們的SVN源碼沖突一樣,對於同一行代碼的沖突,只能交給開發者自己來處理。(在本文後後面會討論一下Dynamo的Vector Clock)
Two/Three Phase Commit
這個協議的縮寫又叫2PC,中文叫兩階段提交。在分布式系統中,每個節點雖然可以知曉自己的操作時成功或者失敗,卻無法知道其他節點的操作的成功或失敗。當一個事務跨越多個節點時,為了保持事務的ACID特性,需要引入一個作為協調者的組件來統一掌控所有節點(稱作參與者)的操作結果並最終指示這些節點是否要把操作結果進行真正的提交(比如將更新後的數據寫入磁碟等等)。
Ⅲ 求救,分布式事務怎麼處理
目前比較多的解決方案有幾個:
一、結合MQ消息中間件實現的可靠消息最終一致性
二、TCC補償性事務解決方案
三、最大努力通知型方案
第一種方案:可靠消息最終一致性,需要業務系統結合MQ消息中間件實現,在實現過程中需要保證消息的成功發送及成功消費。即需要通過業務系統控制MQ的消息狀態
第二種方案:TCC補償性,分為三個階段TRYING-CONFIRMING-CANCELING。每個階段做不同的處理。
TRYING階段主要是對業務系統進行檢測及資源預留
CONFIRMING階段是做業務提交,通過TRYING階段執行成功後,再執行該階段。默認如果TRYING階段執行成功,CONFIRMING就一定能成功。
CANCELING階段是回對業務做回滾,在TRYING階段中,如果存在分支事務TRYING失敗,則需要調用CANCELING將已預留的資源進行釋放。
第三種方案:最大努力通知xing型,這種方案主要用在與第三方系統通訊時,比如:調用微信或支付寶支付後的支付結果通知。這種方案也是結合MQ進行實現,例如:通過MQ發送http請求,設置最大通知次數。達到通知次數後即不再通知。
具體的案例你也可以參考下這篇博客,它上面有完整的電商系統分布式事務實現案例:http://www.roncoo.com/article/detail/124243
Ⅳ Java都需要那些技術
Java工程師需要學習的技術還是比較多的。
尤其是現在技術更新迭代比較快,需要不斷學習掌握新的技術,給自身鍍金才燃扮能在IT行業發展的較好。
下面列舉出來一些需要掌握的技術:
1、理解Java面向對象思想
2、掌握開發中常用基礎API
3、熟練使用集合框架、IO流、異常
4、能夠基於JDK8開發
5、掌握流行關系型數據MySQL常見操作
6、熟練增刪改查數據處理
7、掌握Java JDBC、連接池操作
8、掌握基本的JavaWeb基礎知識JSP/Servlet/Vue等
9、具備基本的B/S結構軟體開發能力
10、可以動手開襪段賣發一個B/S架構的Web項目
11、掌握SSM框架技術
12、掌告逗握使用Maven進行模塊的開發
13、熟悉基本的Linux命令以及Linux伺服器的使用
14、掌握高級緩存技術Redis的原理,並熟練使用
15、掌握Git、Nginx、Docker、Elasticsearch、SpringBoot、SpringCloud、RabbitMQ、分布式事務、JVM、JUC、Zookeeper、Dubbo、Nacos等技術
16、企業級開發項目
雖然需要學習掌握的技術比較多,但是堅信「只要功夫深鐵杵磨成針」,加油!
Ⅳ java分布式架構有哪些技術
既然是分布式系統,系統間通信的技術就不可避免的要掌握。
首先,我們必須掌握一些基本知識,例如網路通信協議(例如TCP / UDP等),網路IO(Blocking-IO,NonBlocking-IO,Asyn-IO),網卡(多隊列等)。 了解有關連接重用,序列化/反序列化,RPC,負載平衡等的信息。
在學習了這些基本知識之後,您基本上可以在分布式系統中編寫一個簡單的通信模塊,但這實際上還遠遠不夠。 現在,您已經進入了分布式欄位,您已經對規模有很多要求。 這意味著需要一種通信程序,該程序可以支持大量連接,高並發性和低資源消耗。
大量的連接通常會有兩種方式:
大量client連一個server
當前在NonBlocking-IO非常成熟的情況下,支持大量客戶端的伺服器並不難編寫,但是在大規模且通常是長連接的情況下,有一點需要特別注意 ,即伺服器掛起時不可能所有客戶端都在某個時間點啟動重新連接。 那基本上是一場災難。 我見過一些沒有經驗的類似案例。 客戶端規模擴大後,伺服器基本上會在重新啟動後立即刷新。 大量傳入連接中斷(當然,伺服器的積壓隊列首先應設置為稍大一些)。 可以使用的通常方法是在客戶端重新連接之前睡眠一段隨機的時間。 另外,重連間隔採用避讓演算法。
一個client連大量的server
有些場景也會出現需要連大量server的現象,在這種情況下,同樣要注意的也是不要並發同時去建所有的連接,而是在能力范圍內分批去建。
除了建連接外,另外還要注意的地方是並發發送請求也同樣,一定要做好限流,否則很容易會因為一些點慢導致內存爆掉。
這些問題在技術風險上得考慮進去,並在設計和代碼實現上體現,否則一旦隨著規模上去了,問題一時半會還真不太好解。
高並發這個點需要掌握CAS、常見的lock-free演算法、讀寫鎖、線程相關知識(例如線程交互、線程池)等,通信層面的高並發在NonBlocking-IO的情況下,最重要的是要注意在整體設計和代碼實現上盡量減少對io線程池的時間佔用。
低資源消耗這點的話NonBlocking-IO本身基本已經做到。
伸縮性
分布式系統基本上意味著規模不小。 對於此類系統,在設計時必須考慮可伸縮性。 在體系結構圖上繪制的任何點,如果請求量或數據量繼續增加,該怎麼辦? 通過添加機器來解決。 當然,此過程不需要考慮無限的情況。 如果您有經驗的建築師,從相對較小的規模到非常大型的范圍,那麼優勢顯然並不小,而且它們也將越來越稀缺。 。
橫向可擴展性(Scale Out)是指通過增加伺服器數量來提高群集的整體性能。 垂直可伸縮性(Scale Up)是指提高每台伺服器的性能以提高集群的整體性能。 縱向可擴展性的上限非常明顯,而分布式系統則強調水平可伸縮性。
分布式系統應用服務最好做成無狀態的
應用服務的狀態是指運行時程序因為處理服務請求而存在內存的數據。分布式應用服務最好是設計成無狀態。因為如果應用程序是有狀態的,那麼一旦伺服器宕機就會使得應用服務程序受影響而掛掉,那存在內存的數據也就丟失了,這顯然不是高可靠的服務。把應用服務設計成無狀態的,讓程序把需要保存的數據都保存在專門的存儲上(eg. 資料庫),這樣應用服務程序可以任意重啟而不丟失數據,方便分布式系統在伺服器宕機後恢復應用服務。
伸縮性的問題圍繞著以下兩種場景在解決:
無狀態場景
對於無狀態場景,要實現隨量增長而加機器支撐會比較簡單,這種情況下只用解決節點發現的問題,通常只要基於負載均衡就可以搞定,硬體或軟體方式都有;
無狀態場景通常會把很多狀態放在db,當量到一定階段後會需要引入服務化,去緩解對db連接數太多的情況。
有狀態場景
所謂狀態其實就是數據,通常採用Sharding來實現伸縮性,Sharding有多種的實現方式,常見的有這么一些:
2.1 規則Sharding
基於一定規則把狀態數據進行Sharding,例如分庫分表很多時候採用的就是這樣的,這種方式支持了伸縮性,但通常也帶來了很復雜的管理、狀態數據搬遷,甚至業務功能很難實現的問題,例如全局join,跨表事務等。
2.2 一致性Hash
一致性Hash方案會使得加機器代價更低一些,另外就是壓力可以更為均衡,例如分布式cache經常採用,和規則Sharding帶來的問題基本一樣。
2.3 Auto Sharding
Auto Sharding的好處是基本上不用管數據搬遷,而且隨著量上漲加機器就OK,但通常Auto Sharding的情況下對如何使用會有比較高的要求,而這個通常也就會造成一些限制,這種方案例如HBase。
2.4 Copy
Copy這種常見於讀遠多於寫的情況,實現起來又會有最終一致的方案和全局一致的方案,最終一致的多數可通過消息機制等,全局一致的例如zookeeper/etcd之類的,既要全局一致又要做到很高的寫支撐能力就很難實現了。
即使發展到今天,Sharding方式下的伸縮性問題仍然是很大的挑戰,非常不好做。
上面所寫的基本都還只是解決的方向,到細節點基本就很容易判斷是一個解決過多大規模場景問題的架構師,:)
穩定性
作為分布式系統,必須要考慮清楚整個系統中任何一個點掛掉應該怎麼處理(到了一定機器規模,每天掛掉一些機器很正常),同樣主要還是分成了無狀態和有狀態:
無狀態場景
對於無狀態場景,通常好辦,只用節點發現的機制上具備心跳等檢測機制就OK,經驗上來說無非就是純粹靠4層的檢測對業務不太夠,通常得做成7層的,當然,做成7層的就得處理好規模大了後的問題。
有狀態場景
對於有狀態場景,就比較麻煩了,對數據一致性要求不高的還OK,主備類型的方案基本也可以用,當然,主備方案要做的很好也非常不容易,有各種各樣的方案,對於主備方案又覺得不太爽的情況下,例如HBase這樣的,就意味著掛掉一台,另外一台接管的話是需要一定時間的,這個對可用性還是有一定影響的;
全局一致類型的場景中,如果一台掛了,就通常意味著得有選舉機制來決定其他機器哪台成為主,常見的例如基於paxos的實現。
可維護性
維護性是很容易被遺漏的部分,但對分布式系統來說其實是很重要的部分,例如整個系統環境應該怎麼搭建,部署,配套的維護工具、監控點、報警點、問題定位、問題處理策略等等。
Ⅵ java程序員在面試中被問到如何配置多數據源以及如何配置多數據源下的分布式事務,該怎麼回答看清再做答
你好,我來先回答你的第一個問題:
通常多數據源,在spring中配置如下,如果你想切換環境ENV 的值,在property中
<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"></property>
<property name="" value="true"></property>
<property name="nullValue" value="NULL"></property>
<property name="locations">
<list>
<value>jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="com.spring..JDBCConfig">
<property name="driverClassName" value="${${Env}.jdbc.driverClassName}"></property>
<property name="url" value="${${Env}.jdbc.url}"></property>
<property name="username" value="${${Env}.jdbc.username1}"></property>
<property name="password" value="${${Env}.jdbc.password}"></property>
</bean>
jdbc.properties
*****************************
Env=PROD
jdbc.driverClassName=${${Env}.jdbc.driverClassName}
jdbc.url=${${Env}.jdbc.url}
jdbc.username=${${Env}.jdbc.username}
jdbc.password=${${Env}.jdbc.password}
######### JDBC Configuration for DEV Environment ###############
DEV.jdbc.driverClassName=com.mysql.jdbc.Driver
DEV.jdbc.url=jdbc:mysql://localhost:3306/devportal
DEV.jdbc.username=DEVuser
DEV.jdbc.password=DEVpwd
######### JDBC Configuration for UAT Environment ############
UAT.jdbc.driverClassName=com.mysql.jdbc.Driver
UAT.jdbc.url=jdbc:mysql://localhost:3306/UATportal
UAT.jdbc.username=UATuser
UAT.jdbc.password=UATpwd
########## JDBC Configuration for PROD Environment ############
PROD.jdbc.driverClassName=com.mysql.jdbc.Driver
PROD.jdbc.url=jdbc:mysql://localhost:3306/portal
PROD.jdbc.username=root
PROD.jdbc.password=admin,
我這里有三套環境,分別是DEV,UAT和PROD,這種方式可以靈活切換的。
我再回答你的第二個問題:
還請你去http://docs.spring.io/spring-framework/docs/4.0.x/spring-framework-reference/html/transaction.html這里看下,很詳細,不過是英文的哦
Ⅶ java的框架spring如何配置分布式事務
分布式事務本身不是程序做的,我們不需要在代碼中明確地做這些事,因為是不是分布式對於代碼來說,代碼寫起來完全相同。
只是選擇支持 JTA XA (也叫 2-Phase Commit, 2PC) 的數據源就可以了,你默認使用的 DataSource 可能不是 XA ( Weblogic 把它叫 TX)。
一般在網站編程時多數人可能是用 Spring 搭配 tomcat commons-dbcp 那個數據源,那個可能就不是支持 XA 的數據源,如果你打算在復雜企業應用生態系統中使用J2EE 就不要用 Spring 提供 commonbs-dbcp 那種小作坊式的做法,因為它是假設自己的程序就是獨立生態系統,當你需要與外界打交道時就碰到諸多問題,這也是為什麼很多大企業依然還是會使用 EJB 的原因(EJB 已經考慮到這點,並把它寫入到J2EE 標准中),我們推薦用伺服器自己的數據源,也就是 lookup JNDI,這樣的話,是不是 XA 事務就由伺服器的配置來定製,代碼就不需要任何配置來決定是不是 XA 了 ;事務本身是不是 XA (分布式的)是伺服器的事,伺服器來管理「資源」 (包括數據源,JMS 連接等,一個資源(JDBC連接)如何參與事務是「資源管理器」(驅動程序)的職責,跟程序無關),伺服器提供事務管理並作為「事務協調者」來處理多個「資源管理器」(不同的資料庫連接)之間的事務一致性,,而 Spring 的職責很簡單,對於我們希望 Spring 自動提交或回滾事務時,在配置中指定需要回滾的異常的類型。
不過我沒有實際使用過 Spring,我有多年的 EJB 經驗,這其中的原理是相同的,因為這是 J2EE 標准規范要求達到的。
Ⅷ 目前主流的Java分布式框架有哪些,學起來難不難
Java框架可以簡化開發難度,更便於我們開發程序。所以學好Java框架還是比較重要的。Java的框架主要有:SpringMVC、Spring、Mybatis、Dubbo、Maven、RabbitMQ、Log4j、Ehcache、Redis、Shiro。不過這十個我們不需要都學會,只要學會其中四五個比較常用的就可以。
1.SpringMVC。Spring MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,主要是幫助我們簡化日常的Web開發;
2.Mybatis。MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架;
3.Spring。Spring深得企業的青睞;
4.Maven。越來越多的開發人員開始使用maven。
(8)java分布式事務擴展閱讀:
java的學習,可以按照優就業的java課程大綱進行學習:
一、JavaEE基礎
Java基礎語法、面向對象、核心類庫、集合、異常、IO、線程、JDK新特性
二、JavaWeb開發
前端技術、資料庫、JAVA資料庫操作、軟體伺服器及伺服器相關技術、動態網頁JSP、AJAX、優就業-在線醫療系統
三、Java高級框架
SpringMVC、MyBatis、Spring、MySQL高級、Linux&Redis&Nginx、Maven、中公MIS許可權系統
四、大型微服務分布式項目實戰
SpringBoot、SpringCloud、Git、Dubbo、Zookeeper、AngularJS、Spring Security、BCrypt加密、FastDFS、分布式事務處理、Redis Cluster、Solr、SolrCloud、Freemarker、JMS、簡訊發送平台、SSO解決方案、CORS、Twitter的Snowflake、SpringTask、Maven Profile、MongoDB簡介、MyCat、Docker、Jenkins、東易買大型電商實戰、東易眾籌
五、微服務大型項目實戰。
Ⅸ 有沒有大佬,知道java分布式怎麼實現單列模式。描述一個大概的原理就OK。感謝!
首先一點,我覺得你問了一個不存在的問題,而且你問的這個問題很奇怪,根本原因是你的知識面受限!
其次,如果你要想在分布式中實現類似單個虛擬機中的單例模式,你應該是要轉換思路,也就是說尋找其他可行的辦法來解決你遇到需要在分布式下想用單例模式來解決的問題!
最後,單例模式在實際應用中,一個單例模式的對象,各方面都要只有一個的,包括對象只有一個、對象鎖只有一個等等,而在分布式環境下,即多個JVM(虛擬機)中不可能能實現多個JVM共享一個對象,也沒有這個必要!