多线程的互斥同步(存款取款基础版)

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 }

 通常将互斥的资源定义为一个类中加上同步所。在多线程使用的时候就会很方便....

原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4083824.html