static共享java
1,建立須要共享消息的實體massageide
package aaa; public class massage { /*a是否向b傳了一段消息,1/0 是/否 */ public static int aFromB=0; /*b是否向a傳了一段消息,1/0 是/否 */ public static int bFromA=0; /*a向b傳遞的消息*/ public static String aMassage; /*b向a傳遞的消息*/ public static String bMassage; public static int getaFromB() { return aFromB; } public static void setaFromB(int aFromB) { massage.aFromB = aFromB; } public static int getbFromA() { return bFromA; } public static void setbFromA(int bFromA) { massage.bFromA = bFromA; } public static String getaMassage() { return aMassage; } public static void setaMassage(String aMassage) { massage.aMassage = aMassage; } public static String getbMassage() { return bMassage; } public static void setbMassage(String bMassage) { massage.bMassage = bMassage; } }
2,建立a對象this
package aaa; public class aObj extends massage implements Runnable{ @Override public void run() { // TODO Auto-generated method stub aMassage="真的好想你"; System.out.println("a說:"+aMassage); aFromB=1; int i=0; while(bFromA==0){ if(i==0){ System.out.println("a忐忑的等着回覆"); } i++; } aMassage="世界那麼大,其實只有你"; System.out.println("a說:"+aMassage); aFromB=1; } public void start(){ Thread s=new Thread(this); s.start(); } }
3,建立b對象spa
package aaa; public class bObj extends massage implements Runnable{ @Override public void run() { // TODO Auto-generated method stub int i=0; while(aFromB==0){ if(i==0){ System.out.println("b看着a的灰色頭像發着呆"); } i++; } bMassage="有多想呀"; System.out.println("b說:"+bMassage); aFromB=0; bFromA=1; } public void start(){ Thread s=new Thread(this); s.start(); } }
4,執行線程
package aaa; public class mains { public static void main(String[] args) { // TODO Auto-generated constructor stub new bObj().start(); new aObj().start(); } }
5,結果3d
原理分析:咱們應當發現a實體和b實體都繼承自消息實體,在建立實體a和b的時候,會自動實例化父類。所以來講,a和b有兩個不一樣的父類的對象,可是爲何他們之間「能夠互傳消息」呢?這實際上是一個假象 其實他們並無互傳消息,what?由於消息類的變量是static修飾,工做機制是這樣的,當實例化a的時候自動實例了一個a消息父類,這個時候會建立static變量,將變量與內存地址關聯。當實例化b的時候,實例了一個b消息父類,請注意這個時候將再也不建立變量而是直接將以前的地址賦給了這個變量,所以,a和b中更改變量值其實實在直接更改了內存地址上的值。code
單例模式共享對象
1,建立消息實體類blog
package aaa; public class massage { private static massage s=new massage(); public static massage getObj(){ return s; } /*a是否向b傳了一段消息,1/0 是/否 */ public int aFromB=0; /*b是否向a傳了一段消息,1/0 是/否 */ public int bFromA=0; /*a向b傳遞的消息*/ public String aMassage; /*b向a傳遞的消息*/ public String bMassage; public int getaFromB() { return aFromB; } public void setaFromB(int aFromB) { this.aFromB = aFromB; } public int getbFromA() { return bFromA; } public void setbFromA(int bFromA) { this.bFromA = bFromA; } public String getaMassage() { return aMassage; } public void setaMassage(String aMassage) { this.aMassage = aMassage; } public String getbMassage() { return bMassage; } public void setbMassage(String bMassage) { this.bMassage = bMassage; } }
2,建立a對象繼承
package aaa; public class aObj extends massage implements Runnable{ @Override public void run() { // TODO Auto-generated method stub massage.getObj().setaMassage("真的好想你"); System.out.println("a說:"+massage.getObj().getaMassage()); massage.getObj().setaFromB(1); int i=0; while(massage.getObj().getbFromA()==0){ if(i==0){ System.out.println("a忐忑的等着回覆"); } i++; } massage.getObj().setaMassage("世界那麼大,其實只有你"); System.out.println("a說:"+massage.getObj().getaMassage()); massage.getObj().setaFromB(1);; } public void start(){ Thread s=new Thread(this); s.start(); } }
3,建立b對象
package aaa; public class bObj extends massage implements Runnable{ @Override public void run() { // TODO Auto-generated method stub int i=0; while(massage.getObj().getaFromB()==0){ if(i==0){ System.out.println("b看着a的灰色頭像發着呆"); } i++; } massage.getObj().setbMassage("有多想呀"); System.out.println("b說:"+massage.getObj().getbMassage()); massage.getObj().setaFromB(0); massage.getObj().setbFromA(1); } public void start(){ Thread s=new Thread(this); s.start(); } }
4,運行
package aaa; public class mains { public static void main(String[] args) { // TODO Auto-generated constructor stub new bObj().start(); new aObj().start(); } }
5,結果
原理分析:相比較與static共享數據,單例模式共享更加符合邏輯,由於單例模式在共享數據的過程當中始終是在用一個massage對象,使用一個對象,即是共用一個做用域來進行消息交換