Java多线程及synchronized用法理解

2019-08-17  本文已影响0人  柳蒿

如何写一个多线程Demo

   public void Demo1() {
        DeadLock deadLock = new DeadLock();
        new Thread() {
            @Override
            public void run() {
            //    deadLock.cycleFetch(Thread.currentThread().getName(), 10);
                for (int i = 0; i <10; i++) {
                    System.out.println(Thread.currentThread().getName());
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
            //    deadLock.cycleFetch(Thread.currentThread().getName(), 10);
                for (int i = 0; i <10; i++) {
                    System.out.println(Thread.currentThread().getName());
                }
            }
        }.start();
    }
    synchronized boolean fetchB(String str, int num) {
        if (this.B - num >= 0) {
            this.B -= num;
            System.out.println(str + " fetch B, B = " + this.B);
            return true;
        } else {
            System.out.println(str + " cannot fetch B");
            return false;
        }
    }

Java多线程的争抢问题

线程的运行状态及进度是不可预知的。
通常,我们在写多线程Demo的时候会发现有些操作并不是同步的,然而输出的结果却好像是两个线程在调用同步的方法,给我们一种错觉。
实际上,这种结果是因为线程调度出现了一边倒的情况。比如线程A抢不过线程B,只有当线程B运行完毕后,线程A才能获得CPU,并开始运行。
如果出现了这种情况,可以用Thread.sleep()方法让线程休眠,甚至是让两个线程休眠相同的时间都可以大大降低这种情况出现的概率

public void run2() {
        DeadLock deadLock = new DeadLock();
        new Thread() {
            @Override
            public void run() {
                deadLock.cycleFetch("one", 20);

            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                while (deadLock.fetchB2("two", 2)) {
              
                }
            }
        }.start();
    }

synchronized使用注意事项

synchronized用起来并不简单,不是说我们只要给一个代码块,一个方法,或者是一个对象加了synchronized,就可以高枕无忧的以各种各样的姿势使用多线程并发访问这个代码块/方法/对象了。
要注意的是:只有当多线程访问的是同一个同步代码块/方法/对象,才能实现同步访问。

    public void run3(String threadName) {
        synchronized (DeadLock.class) {
            for (int i = 0; i < 20; i++) {
                this.A--;
                System.out.println(threadName + " , " + this.A);
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读