• Java多线程数据同步操作


    如何解决多线程时的数据同步问题

    一个字

    Java是为数不多可以执行多线程的语言

    前几天做了 Java对于多线程的基本操作 但是 多个线程 对同一个资源访问的时候 肯定会出现数据不同步的问题

    **synchronized **关键字

    synchronized() {
    //synchronized 代码块
    }
    

    举例一个简单的抢票操作

    package com.xiaowang;
    class Mythread implements Runnable {
        private Integer ticket = 100;
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (ticket>0) {
                    System.out.println(Thread.currentThread().getName()+"这票还有:"+ticket --);
                }
            }
        }
    }
    class test {
        public static void main(String args[]) {
            Mythread mt = new Mythread();
            new Thread(mt,"抢票的A:").start();
            new Thread(mt,"抢票的B:").start();
            new Thread(mt,"抢票的C:").start();
        }
    }
    
    

    执行结果

    抢票的A:这票还有:15
    抢票的C:这票还有:15
    抢票的B:这票还有:14
    抢票的B:这票还有:13
    抢票的C:这票还有:13
    抢票的A:这票还有:12
    抢票的A:这票还有:11
    抢票的B:这票还有:11
    抢票的C:这票还有:11
    抢票的A:这票还有:10
    抢票的C:这票还有:10
    抢票的B:这票还有:10
    抢票的B:这票还有:9
    抢票的A:这票还有:9
    抢票的C:这票还有:9
    抢票的A:这票还有:8
    抢票的B:这票还有:6
    抢票的C:这票还有:7
    抢票的A:这票还有:5
    抢票的B:这票还有:4
    抢票的C:这票还有:4
    抢票的C:这票还有:3
    抢票的A:这票还有:2
    抢票的B:这票还有:1
    
    

    太长了 缩短一点从20票以后来看

    会发现 数据并不同步

    添加刚刚说的关键字 再查看效果

    代码

    package com.xiaowang;
    class Mythread implements Runnable {
        private Integer ticket = 100;
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }synchronized (this) { //只允许 一个进程
                    if (ticket>0) {
                        System.out.println(Thread.currentThread().getName()+"这票还有:"+ticket --);
                    }
                }
            }
        }
    }
    class test {
        public static void main(String args[]) {
            Mythread mt = new Mythread();
            new Thread(mt,"抢票的A:").start();
            new Thread(mt,"抢票的B:").start();
            new Thread(mt,"抢票的C:").start();
        }
    }
    
    

    执行效果

    抢票的B:这票还有:39
    抢票的A:这票还有:38
    抢票的B:这票还有:37
    抢票的C:这票还有:36
    抢票的A:这票还有:35
    抢票的A:这票还有:34
    抢票的C:这票还有:33
    抢票的B:这票还有:32
    抢票的C:这票还有:31
    抢票的A:这票还有:30
    抢票的B:这票还有:29
    抢票的C:这票还有:28
    抢票的B:这票还有:27
    抢票的A:这票还有:26
    抢票的A:这票还有:25
    抢票的B:这票还有:24
    抢票的C:这票还有:23
    抢票的C:这票还有:22
    抢票的A:这票还有:21
    抢票的B:这票还有:20
    抢票的C:这票还有:19
    抢票的B:这票还有:18
    抢票的A:这票还有:17
    抢票的B:这票还有:16
    抢票的C:这票还有:15
    抢票的A:这票还有:14
    抢票的A:这票还有:13
    抢票的C:这票还有:12
    抢票的B:这票还有:11
    抢票的C:这票还有:10
    抢票的A:这票还有:9
    抢票的B:这票还有:8
    抢票的C:这票还有:7
    抢票的B:这票还有:6
    抢票的A:这票还有:5
    抢票的C:这票还有:4
    抢票的A:这票还有:3
    抢票的B:这票还有:2
    抢票的A:这票还有:1
    
    

    截取一些

    但是 数据同步会导致运行速度变慢

    异步操作才能得到性能的提升

    也可利用同步方法

    在方法定义上 用synchronized 关键字

    上代码

    package com.xiaowang;
    
    class Mythread implements Runnable {
        private Integer ticket = 100;
    
        public synchronized boolean seal() {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "这票还有:" + ticket--);
                return true;
            } else
                System.out.println("没票了");
                return false;
        }
    
        @Override
        public void run() {
            while (this.seal()) {
                ;
            }
        }
    }
    
    class test {
        public static void main(String args[]) {
            Mythread mt = new Mythread();
            new Thread(mt, "抢票的A:").start();
            new Thread(mt, "抢票的B:").start();
            new Thread(mt, "抢票的C:").start();
        }
    }
    
    

    数据同步 一定会导致运行效率变慢

  • 相关阅读:
    android音乐播放器开发 SweetMusicPlayer 摇一摇换歌
    kernel logo到开机动画之间闪现黑屏(android 5.X)
    [DLX反复覆盖] hdu 3656 Fire station
    使用清华源 tensorflow 安装
    类别不平衡问题之SMOTE算法(Python imblearn极简实现)
    在Ubuntu 18.04上安装OpenCV 4(C ++和Python)
    OpenCV
    git clone速度太慢的解决办法
    OpenCV 3.4.2 环境搭建(适用于Ubuntu 一键安装)
    ubuntu16.04安装opencv3.4.1教程
  • 原文地址:https://www.cnblogs.com/laowt/p/14545791.html
Copyright © 2020-2023  润新知