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();
    }
}

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

原文地址:https://www.cnblogs.com/laowt/p/14545791.html