互斥:
synchronized//给counter方法加锁,注意:这里的synchronized的信号量是this
public void counter(String s) {
System.out.println(s);
}
public void innerCounter(String s) {
synchronized(this) {//使用信号量s进行加锁,这里一定要同一个对象
System.out.println(s);
}
}
public static synchronized void staticCounter(String s) {//使用Counter的字节码信号量(Counter.class)进行加锁,这里一定要同一个对象
System.out.println(s);
}
通信:
private boolean flag = true;
public synchronized void subThread(int i) {
while (!<span style="font-family: Arial, Helvetica, sans-serif;">flag </span><span style="font-family: Arial, Helvetica, sans-serif;">) {// 这里要价格判断,防止假唤醒(wait的时候有时会发生唤醒,即假唤醒)</span>
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//do something
flag = false;
this.notify();// 唤醒其他在等待的线程
}
public synchronized void mainThread(int i) {
while (flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//do something
flag = true;
this.notify();// 唤醒其他在等待的线程
}