多线程访问共享对象和数据的方式
生活随笔
收集整理的這篇文章主要介紹了
多线程访问共享对象和数据的方式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在多線程訪問(wèn)共享對(duì)象和數(shù)據(jù)時(shí)候大致可以分為兩大類。
1:如果每個(gè)線程執(zhí)行的代碼相同,可以使用同一個(gè)runnable對(duì)象,這個(gè)runnable對(duì)象中有那個(gè)共享對(duì)象。如:買票系統(tǒng)。
public class MulteThreadlShareData {public static void main(String[] args) {ShareData shareData = new ShareData();new Thread(shareData).start();new Thread(shareData).start();}static class ShareData implements Runnable{int count = 100;@Overridepublic void run() {while(count>0){decrease();}}public synchronized void decrease(){count--;System.out.println(Thread.currentThread().getName()+"this count: "+count);}} }?
2:如果每個(gè)線程執(zhí)行的代碼不相同,就要用不同的runnable對(duì)象了。這種方式又有兩種來(lái)實(shí)現(xiàn)這些runnable對(duì)象之間的數(shù)據(jù)共享。
- 將共享數(shù)據(jù)封裝在另一個(gè)對(duì)象中,然后將這個(gè)對(duì)象逐一傳遞給各個(gè)runnable對(duì)象中。每個(gè)線程共享數(shù)據(jù)的操作方法也分配到了這個(gè)對(duì)象身上去完成,這樣容易實(shí)現(xiàn)針對(duì)該數(shù)據(jù)進(jìn)行共享數(shù)據(jù)的互斥和通信。代碼實(shí)現(xiàn)如下: public class MulteThreadlShareData2 {public static void main(String[] args) {final ShareData shareData = new ShareData();new Thread(new Decrease(shareData)).start();new Thread(new Increment(shareData)).start();}static class Decrease implements Runnable{private ShareData shareData;public Decrease(ShareData shareData){this.shareData=shareData;}@Overridepublic void run() {shareData.decrease();}}static class Increment implements Runnable{private ShareData shareData;public Increment(ShareData shareData){this.shareData=shareData;}@Overridepublic void run() {shareData.increment();}}static class ShareData{int count = 100;public synchronized void decrease(){count--;System.out.println(Thread.currentThread().getName()+"decrease this count: "+count);}public synchronized void increment(){count++;System.out.println(Thread.currentThread().getName()+"increment this count: "+count);}}
}
?
- 將這些runnable對(duì)象作為某個(gè)類的內(nèi)部類,共享數(shù)據(jù)作為這個(gè)外部類的成員變量,每個(gè)線程對(duì)共享數(shù)據(jù)的操作也分配到外部類,以便實(shí)現(xiàn)對(duì)共享數(shù)據(jù)進(jìn)行的各個(gè)操作進(jìn)行互斥和通信,作為內(nèi)部類的各個(gè)runnable對(duì)象調(diào)用外部類的這些方法。 public class MulteThreadlShareData3 {static int count = 100;public static void main(String[] args) {new Thread(new Decrease()).start();new Thread(new Increment()).start();}public synchronized static void decrease(){count--;System.out.println(Thread.currentThread().getName()+"decrease this count: "+count);}public synchronized static void increment(){count++;System.out.println(Thread.currentThread().getName()+"increment this count: "+count);}static class Decrease implements Runnable{@Overridepublic void run() {decrease();}}static class Increment implements Runnable{@Overridepublic void run() {increment();}}
}
?
- 上面兩種方式的結(jié)合:將共享數(shù)據(jù)封裝到另一個(gè)對(duì)象中,各個(gè)線程對(duì)共享數(shù)據(jù)操作的方法也分配到那個(gè)對(duì)象上去完成,對(duì)象作為外部類的成員變量或方法的局部變量,每個(gè)runnable對(duì)象作為外部類中的成員內(nèi)部類或局部?jī)?nèi)部類。 public class MulteThreadlShareData1 {public static void main(String[] args) {final ShareData shareData = new ShareData();new Thread(new Runnable() {@Overridepublic void run() {while(true){shareData.decrease();} }}).start();new Thread(new Runnable() {@Overridepublic void run() {while(true){shareData.increment();}}}).start();}static class ShareData{int count = 100;public synchronized void decrease(){count--;System.out.println(Thread.currentThread().getName()+"this count: "+count);}public synchronized void increment(){count++;System.out.println(Thread.currentThread().getName()+"this count: "+count);}}
}
?
總之:要同步和互斥的幾段代碼最好放在幾個(gè)獨(dú)立的方法中,這些方法在放在同一個(gè)類中,這樣容易實(shí)現(xiàn)他們之間的同步互斥和通信。
總結(jié)
以上是生活随笔為你收集整理的多线程访问共享对象和数据的方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 史上最全Java多线程面试题及答案
- 下一篇: 一个多线程死锁案例,如何避免及解决死锁问