zoukankan      html  css  js  c++  java
  • Java多线程同步 synchronized 关键字的使用

    代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块。

    JAVA多线程买票案例

    synchronized 同步

    用synchronized 块实现同步

        public static void main(String[] args) {
            // runable对象的属性代表了一共多少张票
            // runable对象的run方法实现了买票的动作
            Runnable runnable = new Runnable() {
                private int count = 100;
                @Override
                public void run() {
                    while (true) {
                        synchronized (this) { // synchronized 的对象如果
                            Thread currentThread = Thread.currentThread();
                            if (count > 0) {
                                out.println(currentThread.getName()+ " => " + (101 - count) + "张车票");
                                --count;
                            } else {
                                break;
                            }
                        }
                    }
                }
            };
    
            // 开启100个线程模拟100个售票口
            for (int i = 0; i < 100; i++) {
                new Thread(runnable).start();
            }
        }

    用synchronized 方法 块实现同步

        public static void main(String[] args) {
            // runable对象的属性代表了一共多少张票
            // runable对象的run方法实现了买票的动作
            Runnable runnable = new Runnable() {
                private int count = 100;
    
                @Override
                public void run() {
                    while (true) {
                        if (synchronizedMethod()) break;
                    }
                }
    
                public synchronized boolean synchronizedMethod() {
                    Thread currentThread = Thread.currentThread();
                    if (count > 0) {
                        out.println(currentThread.getName() + " => " + (101 - count) + "张车票");
                        --count;
                        return false;
                    }
                    return true;
                }
            };
    
            // 开启100个线程模拟100个售票口
            for (int i = 0; i < 100; i++) {
                new Thread(runnable).start();
            }
        }

    同步过后的代码输出如下

    Thread-0 => 1张车票
    Thread-0 => 2张车票
    Thread-0 => 3张车票
    Thread-4 => 4张车票
    Thread-4 => 5张车票
    Thread-2 => 6张车票
    ....
    ....
    Thread-34 => 98张车票
    Thread-34 => 99张车票
    Thread-34 => 100张车票

    非同步

    synchronized 块

    把同步块删除

    synchronized 方法

    把 ynchronized 关键字删除

    输出结果如下

    Thread-0 => 1张车票
    Thread-0 => 2张车票
    Thread-2 => 1张车票
    Thread-2 => 4张车票
    Thread-2 => 5张车票
    Thread-2 => 6张车票
    Thread-2 => 7张车票
    Thread-4 => 7张车票
    Thread-1 => 1张车票
    Thread-1 => 10张车票
    Thread-1 => 11张车票
    Thread-1 => 12张车票
    Thread-1 => 13张车票

    可以看出有一个以上的线程访问同一张票
    显然是不合理的

  • 相关阅读:
    Django
    python django框架学习
    Http Header里的Content-Type
    Python 头部 #!/usr/bin/python 和 #!/usr/bin/env python的区别
    关于“编译型语言”和“解释性语言”的区别
    Axure XMind整理交互思路
    异常处理
    re模块
    模块
    正则表达式**************************
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/5979105.html
Copyright © 2011-2022 走看看