Java线程同步问题(50分)

  • 主题发起人 主题发起人 happyloner
  • 开始时间 开始时间
H

happyloner

Unregistered / Unconfirmed
GUEST, unregistred user!
请看下面代码:
class NewThread implements Runnable {
String name;
Thread t;
boolean suspendFlag;

NewThread(String threadname) {
name = threadname;
t = new Thread(this, name);
System.out.println("New thread: " + t);
suspendFlag = false;
t.start();

}
public void run() {
try {
for(int i = 15;
i > 0;
i--) {
System.out.println(name + ": " + i);
Thread.sleep(200);
synchronized(this) { //这里的同步有什么用处?如果去掉对于整个
while(suspendFlag) { // 程序的运行有什么影响?
wait();
}
}
}
} catch (InterruptedException e) {
System.out.println(name + " interrupted.");
}
System.out.println(name + " exiting.");
}
void mysuspend() {
suspendFlag = true;
}
synchronized void myresume() {
suspendFlag = false;
notify();
}
}
class SuspendResume {
public static void main(String args[]) {
NewThread ob1 = new NewThread("One");
NewThread ob2 = new NewThread("Two");
try {
Thread.sleep(1000);
ob1.mysuspend();
System.out.println("Suspending thread One");
Thread.sleep(1000);
ob1.myresume();
System.out.println("Resuming thread One");
ob2.mysuspend();
System.out.println("Suspending thread Two");
Thread.sleep(1000);
ob2.myresume();
System.out.println("Resuming thread Two");
} catch (InterruptedException e) {
System.out.println("Main thread Interrupted");
}
// wait for threads to finish
try {
System.out.println("Waiting for threads to finish.");
ob1.t.join();
ob2.t.join();
} catch (InterruptedException e) {
System.out.println("Main thread Interrupted");
}

System.out.println("Main thread exiting.");
}
}
小弟刚学Java,正看线程部分,对于线程的同步不是非常理解。问题见代码中的注视部分,不甚感激
 
synchronized(this) { //synchronized 修饰的方法 被一个线程访问时 其他线程等待
 
synchronized(this) { //这里的同步有什么用处?如果去掉对于整个
while(suspendFlag) { // 程序的运行有什么影响?
wait();
}
}
我的理解是:无论是同步代码块还是同步方法,其目的是为了避免在多线程访问
共享数据资源的冲突。在楼主这里代码并没有对共享资源的访问.我们知道wait()
方法会把当前线程挂起,直到调用了notify()或notifyAll()方法唤醒线程,同时
释放该对象的同步锁定(对象的锁是在进入synchronized时设定的),如果这里不用
同步代码块锁定对象,那么在wait()释放同步锁,必然出现线程状态异常(经测试)。
 
避免出现suspendFlag的不确定性
 
ZRWeng说的很正确,就是避免共享冲突和deadlock(死锁)
 
后退
顶部