Java同步机制:synchronized,wait,notify
/**
?* 假设A,B两个线程同时运行。但A需要某项前置条件必须满足(data数组装满)后才可以正常运转。 这里让B线程去为满足A的条件去干活。
?*/
public class SYN {
?int[] data = new int[100];
?final Object lock = new Object();
?public SYN() {
? new Thread(new A()).start();
? new Thread(new B()).start();
?}
?private?class A implements Runnable {
? public void run() {
? ?/**
? ? * 因为A需要前置条件(data数据装满)必须得到满足才能运行,所以,在A需要的data数组不满时,先让A等待(实际上是等待B。
? ? * A在等待的同时;B在干活,B装载data数组)
? ? */
? ?synchronized (lock) {
? ? try {
? ? ?System.out.println("A开始等待...");
? ? ?lock.wait();
? ? ?System.out.println("A结束等待!");
? ? ?System.out.println("A前置条件满足,开始做想做的事...");
? ? } catch (Exception e) {
? ? ?e.printStackTrace();
? ? }
? ?}
? }
?}
?private?class B implements Runnable {
? public void run() {
? ?synchronized (lock) {
? ? System.out.println("B开始操作...");
? ? /**
? ? * 这里假设B线程对数组data的数据装载需要费时的操作(如从网络下载)。B先于A,把A需要的数据data装载完毕,然后通知A
? ? */
? ? for (int i = 0; i < 100; i++) {
? ? ?data[i] = i;
? ? ?try {
? ? ? Thread.sleep(10);
? ? ?} catch (Exception e) {
? ? ?}
? ? }
? ? System.out.println("B结束操作!");
? ? lock.notify();
? ? /** 通知A */
? ?}
? }
?}
?public static void main(String[] args) {
? new SYN();
?}
}