美文网首页
Java-0026-Synchronized同步

Java-0026-Synchronized同步

作者: 云转水流 | 来源:发表于2016-08-05 11:54 被阅读22次

2016.8.4

在进行多线程操作时,对一些数据不进行同步的话,可能会产生一些奇奇怪怪的结果,其中可能会有非常严重的后果。

账户类

class BankAccount{
    public double balance=1000;
}

丈夫存钱

class Husband extends Thread{
    BankAccount account;
    public Husband(BankAccount account){
        this.account=account;
    }
    public void run(){
        System.out.println("当前余额:"+account.balance);
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        account.balance=account.balance+200;
        System.out.println("充值后余额:"+account.balance);
    }
}

妻子存钱

class Wife extends Thread{
    BankAccount account;
    public Wife(BankAccount account){
        this.account=account;
    }
    public void run(){
        System.out.println("当前余额:"+account.balance);
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        account.balance=account.balance+200;
        System.out.println("充值后余额:"+account.balance);
    }
}

执行

    public static void main(String[] args){
        BankAccount account=new BankAccount();
        Husband husband = new Husband(account);
        Wife wife = new Wife(account);
        husband.start();
        wife.start();
    }

结果

搜狗截图20160804210535.png
搜狗截图20160804210647.png
搜狗截图20160804210630.png
搜狗截图20160804210601.png

其中第1和第3种情况很严重,存的钱都变少了。


现在我们将run方法修改,用synchronized拿到account对象锁

    public void run(){
        synchronized(account){
            System.out.println("当前余额:"+account.balance);
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            account.balance=account.balance+200;
            System.out.println("充值后余额:"+account.balance);
        }
    }

再运行,就不会产生错误了

搜狗截图20160805114732.png

相关文章

  • Java-0026-Synchronized同步

    2016.8.4 在进行多线程操作时,对一些数据不进行同步的话,可能会产生一些奇奇怪怪的结果,其中可能会有非常严重...

  • Linux sersync day35

    什么是实时同步为什么要实时同步实时同步的原理实时同步的场景实时同步工具选择实时同步案例演示 一、什么是实时同步 实...

  • Spring Cloud——Eureka Server服务同步和

    服务同步 服务同步是Server节点之间的数据同步。分为启动时同步,运行时同步。 启动同步 在EurekaServ...

  • Mac版本有道云笔记 同步失败问题

    Mac 版本 有道云笔记同步异常问题,同步失败,无法同步... 最近使用Mac版本有道云笔记,发现同步文件同步失败...

  • 死磕以太坊源码分析之Fetcher同步

    死磕以太坊源码分析之Fetcher同步 Fetcher 功能概述 区块数据同步分为被动同步和主动同步: 被动同步是...

  • ffmpeg 同步

    音视频同步有三种方式 同步音频到视频 同步到外部时钟 同步视频到音频 同步视频到音频 以audio为基准同步vid...

  • OpenMP多线程——Parallel for

    多线程——线程同步 数据竞争问题 线程互斥同步——critical 线程互斥同步——atmoic 线程互斥同步——...

  • UNIX 的5种IO模型介绍

    IO模型同步、异步、阻塞、非阻塞socket阻塞与非阻塞,同步与异步 同步和异步 同步/异步主要针对C端-同步就像...

  • Redis 主从同步

    同步过程 Redis 支持主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让从服务器从 主服务器备...

  • rsync通过服务同步、Linux系统日志、screen

    rsync通过服务同步 Linux文件同步工具-rsync rsync通过服务同步 Linux文件同步工具-rsy...

网友评论

      本文标题:Java-0026-Synchronized同步

      本文链接:https://www.haomeiwen.com/subject/kyfhsttx.html