1、互斥:多个线程同时访问一个资源的时候,由于线程执行的不稳定,使得资源数据遭到破坏:
经典的例子:银行的存款和取款(两个线程访问一个1000元账户,A线程取200,B线程寸300,由于线程执行的不稳定,在A执行到取出1000-200的操作时,
(此时还未将执行结果保存到账户)CPU执行权到B线程,B取到的还是1000 +300 = 1300....)。为了防止这种情况,应该将互斥的资源加上同步锁
1 package com.thread; 2 /** 3 * 模拟同步取款的问题 4 * @author dr 5 * 6 */ 7 public class ThreadTest { 8 public static void main(String[] args) { 9 final Account account = new Account(); 10 //取出200 11 new Thread(new Runnable() { 12 @Override 13 public void run() { 14 for(int i=0;i<3;i++){ 15 try { 16 Thread.sleep(500); 17 } catch (InterruptedException e) { 18 // TODO Auto-generated catch block 19 e.printStackTrace(); 20 } 21 account.getMoney(200); 22 } 23 } 24 }).start(); 25 //存入300 26 new Thread(new Runnable() { 27 @Override 28 public void run() { 29 for(int i=0;i<3;i++){ 30 try { 31 Thread.sleep(500); 32 } catch (InterruptedException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 account.setMoney(300); 37 } 38 } 39 }).start(); 40 } 41 } 42 class Account { 43 44 private int balance = 1000; 45 46 public synchronized void getMoney(int count){ 47 48 int result =balance - count; 49 if(result >= 0){ 50 balance = result; 51 System.out.println(Thread.currentThread().getName()+"取出:"+count+"元,剩余:"+balance); 52 }else{ 53 System.out.println("余额不足..."); 54 } 55 } 56 public synchronized void setMoney(int count){ 57 58 balance += count; 59 System.out.println(Thread.currentThread().getName()+"存入:"+count+"元,剩余:"+balance); 60 } 61 62 }
通常将互斥的资源定义为一个类中加上同步所。在多线程使用的时候就会很方便....