1. 程式人生 > >執行緒的資料共享和不共享

執行緒的資料共享和不共享

我們都知道java會為每一個物件都會建立自己的區域性變數和堆空間,所以要想執行緒的資料不共享,最直接的方式就是在每個執行緒中執行的程式碼都不是同一個例項物件就好了,如下:

public class ReaderThread implements Runnable{
private int count = 5;
public void run(){
while(count>0){
count–;
System.out.println(“當前”+Thread.currentThread.getName()+”執行緒,count=”+count);
}
}
}

ReaderThread r1 = new ReaderThread();
ReaderThread r2 = new ReaderThread();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
一般情況下,我們都需要共享資料,比如投票,多個人同時投票,這時我們只要一個執行例項就好,也就是說在多個執行緒裡面運行同一份物件例項

public class ReaderThread implements Runnable{
private int count = 5;
public void run(){
while(count>0){
count–;
System.out.println(“當前”+Thread.currentThread.getName()+”執行緒,count=”+count);
}
}
}

ReaderThread r1 = new ReaderThread();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r1);
t1.start();
t2.start();
但是這樣就會出現資料不同步的問題,這時我們可以對操作共享資料的程式碼段加上一個鎖,鎖的意思就是在同一時間,只能有一個執行緒進入該物件的執行方法裡面,對資料進行操作,如上述例子就可以這樣做

public class ReaderThread implements Runnable{
private int count = 5;
public synchronized void run(){
while(count>0){
count–;
System.out.println(“當前”+Thread.currentThread.getName()+”執行緒,count=”+count);
}
}
}

ReaderThread r1 = new ReaderThread();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r1);
t1.start();
t2.start();