import org.omg.Messaging.SyncScopeHelper; public class TestThread { public static void main(String[] args) {
        Tree tree = new Tree();
        tree.value = 100;
        ThreadPiao t1 = new ThreadPiao("线程1",tree);
        ThreadPiao t2 = new ThreadPiao("线程2",tree);
        ThreadPiao t3 = new ThreadPiao("线程3",tree);

        t1.start();
        t2.start();
        t3.start(); try {
            t1.join();//这样可以使线程提前 t2.join();
            t3.join();
       }catch (InterruptedException e){
            e.printStackTrace();
       }
        System.out.println("~~~~"+tree.value);
    }
}
import javax.naming.Name; public class ThreadPiao extends Thread {  private String name; private Tree tree ;
    
    ThreadPiao(String name, Tree tree) {
  this.name = name; this.tree = tree;
    }  public void run() {// synchronized 不用锁run只锁add ,这样的好处是由于此处没加锁_节省效率,<<只锁调用资源的方法就行>>  while (tree.value!=0) {

               tree.sale(name); try {
                Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

}


public class Tree {
  int value;  public synchronized void sale(String name){
            value-=1;
            System.out.println(name+"--->卖了"+"第" + (100 - value) + "张"); //不是从方法内部声明的变量才需要锁 }
    }
}