[기초] 책을 따라했는데 결과가 달라요 - 동기화 문제
호습다
질문1
아래 코드를 실행하면
--------
num1 : 6
num2 : 6
--------
이라는 결과가 나와야 하는데 UseReentrantLock 기본 클래스를 찾을 수 없다면서 실행이 안 되네요ㅜㅜ 왜 이러죠?
import java.util.concurrent.locks.ReentrantLock;
class IHaveTwoNum
{
int num1 = 0;
int num2 = 0;
private final ReentrantLock key1 = new ReentrantLock();
private final ReentrantLock key2 = new ReentrantLock();
public void addOneNum1()
{
key1.lock();
try
{
num1 += 1;
}
finally
{
key1.unlock();
}
}
public void addTwoNum1()
{
key1.lock();
try
{
num1 += 2;
}
finally
{
key1.unlock();
}
}
public void addOneNum2()
{
key2.lock();
try
{
num2 += 1;
}
finally
{
key2.unlock();
}
}
public void addTwoNum2()
{
key2.lock();
try
{
num2 += 2;
}
finally
{
key2.unlock();
}
}
public void showAllNums()
{
System.out.println(num1 : + num1);
System.out.println(num2 : + num2);
}
}
class AccessThread extends Thread
{
IHaveTwoNum twoNumInst;
public AccessThread(IHaveTwoNum inst)
{
twoNumInst = inst;
}
public void run()
{
twoNumInst.addOneNum1();
twoNumInst.addTwoNum1();
twoNumInst.addOneNum2();
twoNumInst.addTwoNum2();
}
}
class SyncObjectKey
{
public static void main(String[] args)
{
IHaveTwoNum numInst = new IHaveTwoNum();
AccessThread at1 = new AccessThread(numInst);
AccessThread at2 = new AccessThread(numInst);
at1.start();
at2.start();
try
{
at1.join();
at2.join();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
numInst.showAllNums();
}
}질문2
아래를 실행하면
---------------------------------
오늘의 뉴스 : 자바의 열기가 뜨겁습니다.
오늘의 뉴스 : 자바의 열기가 뜨겁습니다.
---------------------------------
이렇게 나와야하는데
--------------
오늘의 뉴스 : null
오늘의 뉴스 : null
--------------
이렇게 나옵니다. 책하고 똑같이 했는데 왜 결과가 다를까요 ㅜㅜ
class NewsPaper
{
String todayNews;
boolean isTodayNews = false;
public void setTodayNews(String news)
{
todayNews = news;
isTodayNews = true;
synchronized(this)
{
notifyAll();
}
}
public String getTodayNews()
{
if(isTodayNews = false)
{
try
{
synchronized(this)
{
wait();
}
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
return todayNews;
}
}
class NewsWriter extends Thread
{
NewsPaper paper;
public NewsWriter(NewsPaper paper)
{
this.paper = paper;
}
public void run()
{
paper.setTodayNews(자바의 열기가 뜨겁습니다.);
}
}
class NewsReader extends Thread
{
NewsPaper paper;
public NewsReader(NewsPaper paper)
{
this.paper = paper;
}
public void run()
{
System.out.println(오늘의 뉴스 : + paper.getTodayNews());
}
}
class SyncNewsPaper
{
public static void main(String[] args)
{
NewsPaper paper = new New new NewsPaper();
NewsReader reader1 = new NewsReader(paper);
NewsReader reader2 = new NewsReader(paper);
NewsWriter writer = new NewsWriter(paper);
try
{
reader1.start();
reader2.start();
Thread.sleep(1000);
writer.start();
reader1.join();
reader2.join();
writer.join();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
