java认证辅导:java线程小结Java认证考试
文章作者 100test 发表时间 2010:01:01 15:50:59
来源 100Test.Com百考试题网
1, 为什么wait与notify之前必须要加synchronized?
答案其实很简单,也是为了防止等待-通知机制出现race condition
为什么会出现race condition ?
答: 对象在被wait之前已经被另一线程notify , 之后的wait 会永久停止,并导致deadlock(死锁)
理想情况:
1, 第一个线程判断该对象是否要wait
2, 第一个线程将对象wait
3, 第二个线程再将对象notify
实际情况
1, 第一个线程判断该对象是否要wait
2, 第二个线程将对象notify
3, 第一个线程将对象wait
为了防止这些情况,才需要在wait与notify之前加synchronized
java 代码
A a = A.getInstance().//单例对象,同一份实例不销毁
synchronized (a) {
a.wait().
}
-------------------------------另一线程
A a = A.getInstance().
synchronized(a) {
a.notify().
}
等待-通知机制必须与sychronized一起用,否则自身也会有 race condition.
2, 静态同步方法与非静态同步方法的区别
有时,我们经常会碰到这样的代码!
业务逻辑的封装类:
public class Logic {
private static final Log log = LogFactory.getLog(Logic.class).
private static Logic logic.
private Logic() {}
public static Logic getInstance() {
if (null == logic) {
logic = new Logic().
}
return logic.
}
public static synchronized void testStatic() {
log.info(Thread.currentThread().getName() " : static method is running").
}
public synchronized void testNonStatic() {
log.info(Thread.currentThread().getName() " : non static method is running").
}
}
非静态方法的执行:
public class ThreadRun1 extends Thread {
private static final Log log = LogFactory.getLog(ThreadRun1.class).
public void run() {
Logic logic = Logic.getInstance(). // object reference
try {
Thread.sleep(3000).
} catch (InterruptedException e) {
log.error("some exceptions occured :", e).
}
logic.testNonStatic().
logEnd().
}
private void logEnd() {
log.info("thread run1 end").
}
}
静态类方法的执行
public class ThreadRun2 extends Thread {
private static final Log log = LogFactory.getLog(ThreadRun1.class).
public void run() {
Logic.testStatic(). // class static reference
try {
Thread.sleep(5000).
} catch (InterruptedException e) {
log.error("some error ocuur :", e).
}
logEnd().
}
private void logEnd() {
log.info("thread run2 end").
}
}
测试类
public class TestThread {
/**