线程同步:
当有两个进程并发修改同一文件时就可能造成异常。
意思就是当一个线程要改变一个文件的内容时,却sleep了一段时间,这时另一个线程却改变了这个文件的内容。最后就会出现错误的结果。
为了解决这个问题,java多线程支持引入了同步监视器来解决这个问题。使用同步监视器的通用方法就是同步代码块。
同步代码块的语法格式如下:
synchronized(obj){
······
//此处的代码就是同步代码块
}
上面语法格式中synchronized后括号里的obj就是同步监视器,上面代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。
注意:
任何时刻智能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后,该线程会释放对该同步监视器的锁定。
同步监视器:共享资源的对象。
1 public class SynchronizedClass extends Thread{ 2 private Account account; 3 private double drawbalance; 4 public SynchronizedClass(String name,Account account,double drawbalance){ 5 super(name); 6 this.account=account; 7 this.drawbalance=drawbalance; 8 start(); 9 } 10 public void run(){ 11 synchronized(account){ 12 if(drawbalance>account.getBalance()){ 13 System.out.println("余额不足!"); 14 }else{ 15 System.out.println("吐钱成功!"); 16 try{ 17 sleep(100); 18 account.setBalance(account.getBalance()-drawbalance); 19 System.out.println("余额为:"+account.getBalance()); 20 }catch(Exception e){ 21 System.out.println(e); 22 } 23 } 24 } 25 } 26 public static void main(String[] args){ 27 Account a=new Account("刘腾",100000); 28 new SynchronizedClass("A线程",a,100000); 29 new SynchronizedClass("B线程",a,10000); 30 } 31 } 32 //账户 33 class Account { 34 private String name; 35 private double balance; 36 public Account(){} 37 public Account(String name,double balance){ 38 this.name=name; 39 this.balance=balance; 40 } 41 public void setName(String name){ 42 this.name=name; 43 } 44 public void setBalance(double balance){ 45 this.balance=balance; 46 } 47 public String getName(){ 48 return name; 49 } 50 public double getBalance(){ 51 return balance; 52 } 53 public boolean equals(Object obj){ 54 if(this==obj)return true; 55 if(obj!=null)return false; 56 if(getClass()!=obj.getClass())return false; 57 Account other =(Account) obj; 58 if(other.name==name&&other.balance==balance)return true; 59 else return false; 60 } 61 }