多线程同步

class SyncCounter1
{
 public static void main(String[] args){
  Num num = new Num();
  Thread counter1 = new Counter(num);
  Thread counter2 = new Counter(num);
  for( int i=0; i<10; i++ ){
   if(!num.testEquals()) break;
   try{                 
    Thread.sleep(100);
   }catch(InterruptedException e){
   }
  }
 }
}
class Num
{
 private int x=0;
 private int y=0;
 void increase(){
  x++;
  y++;
 }
 boolean testEquals(){
  boolean ok = (x==y);
  System.out.println( x + "," + y +" :" + ok);
  return ok;
 }
}
class Counter extends Thread
{
 private Num num;
 Counter( Num num ){
  this.num = num;
  this.setDaemon(true);
  this.setPriority(MIN_PRIORITY);
  this.start();
 }
 public void run(){
  while(true){
   num.increase();
  }
 }
}
2.同步
java有互斥锁,保证共享数据操作的完整性
关键字  synchronized  用来与对象的互斥锁联系
*synchronized用法
synchronized(对象){ ... }
synchronized(this)
class SyncCounter2
{
 public static void main(String[] args){
  Num num = new Num();
  Thread counter1 = new Counter(num);
  Thread counter2 = new Counter(num);
  for( int i=0; i<10; i++ ){
   num.testEquals();
   try{                 
    Thread.sleep(100);
   }catch(InterruptedException e){
   }
  }
 }
}
class Num
{
 private int x=0;
 private int y=0;
 synchronized void increase(){
  x++;
  y++;
 }
 synchronized boolean testEquals(){
  boolean ok = (x==y);
  System.out.println( x + "," + y +" :" + ok);
  return ok;
 }
}
class Counter extends Thread
{
 private Num num;
 Counter( Num num ){
  this.num = num;
  this.setDaemon(true);
  this.setPriority(MIN_PRIORITY);
  this.start();
 }
 public void run(){
  while(true){
   num.increase();
  }
 }
}
3.线程的死锁
class Worker
{
 int id;
 public Worker(int id){ this.id=id; }
 synchronized void doTaskWithCooperator(Worker other){
  try{ Thread.sleep(500); } catch(Exception e){}
  synchronized(other){
   System.out.println("doing" + id);
  }
 }
}
class DeadLockDemo{
 public static void main(String[] args) {
  Worker w1 = new Worker(1);
  Worker w2 = new Worker(2);
        Thread td1 = new Thread(()->{
   w1.doTaskWithCooperator(w2);
  });
        Thread td2 = new Thread(()->{
   w2.doTaskWithCooperator(w1);
  });
  td1.start();
  td2.start();
    }
}