JUC并发编程

2021/10/25 1:39:53

本文主要是介绍JUC并发编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

wait/sleep区别

来自不同的类

wait->object

sleep->Thread

 

wait会释放锁

sleep会抱着锁睡觉

Synchronized和Lock区别

 

 

.notifyAll();通知其他线程
.wait();等待 (会释放锁)


(if改为while防止虚假唤醒)
package lock;

import java.util.concurrent.locks.Lock;

public class demo1 {
    public static void main(String[] args) {
        Data data=new Data();
        new Thread(()->{
            for (int i = 0; i <10; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i <10; i++) {
                try {
                    data.Decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i <10 ; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"C").start();
        new Thread(()->{
            for (int i = 0; i <10 ; i++) {
                try {
                    data.Decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"D").start();

    }
}
class Data{
    private  int number=0;
    public synchronized void increment() throws InterruptedException {
        if (number!=0){//0
            this.wait();//等待
        }
        number++;//加1
        System.out.println(Thread.currentThread().getName()+"->"+number);//获取当前线程的名字跟数量
        this.notifyAll();//通知其他线程加一完毕

    }
    public synchronized void Decrement() throws InterruptedException {
        if (number==0){
            this.wait();//等待
        }
        number--;//减一
        System.out.println(Thread.currentThread().getName()+"->"+number);//获取当前线程的名字跟数量
        this.notifyAll();//通知其他线程减一完毕

    }
}
拿两个加法线程A、B来说,比如A先执行,执行时调用了wait方法,那它会等待,此时会释放锁,那么线程B获得锁并且也会执行wait方法,两个加线程一起等待被唤醒。
此时减线程中的某一个线程执行完毕并且唤醒了这俩加线程,那么这俩加线程不会一起执行,其中A获取了锁并且加1,执行完毕之后B再执行。如果是if的话,那么A修改完num后,
B不会再去判断num的值,直接会给num+1。如果是while的话,A执行完之后,B还会去判断num的值,因此就不会执行。

 

 



这篇关于JUC并发编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程