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


    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 }

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

  • 相关阅读:
    jmeter性能测试
    Robotframework 之常用断言关键字
    chrome浏览器的调试器乱码问题
    YDKJS:作用域与闭包
    JavaScript事件循环(Event Loop)机制
    第一次react-native项目实践要点总结
    jsonp 演示实例 —— 基于node
    Jquery属性获取——attr()与prop()
    实现跨域的N种方法
    了解闭包
  • 原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4083824.html
Copyright © 2020-2023  润新知