我是靠谱客的博主 老实身影,最近开发中收集的这篇文章主要介绍多线程通信实现(Synchronized),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

一、创建资源类,在资源类创建属性和操作方法。

二、在资源类操作方法
    (1)判断
    (2)运行
    (3)通知
三、创建多个线程,调用资源类的操作方法

四、防止虚假唤醒问题等
notifyAll
public final void notifyAll()
唤醒正在等待对象监视器的所有线程。 线程通过调用wait方法之一等待对象的监视器。
唤醒的线程将无法继续,直到当前线程释放该对象上的锁。 唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极地竞争在该对象上进行同步; 例如,唤醒的线程在下一个锁定该对象的线程中不会有可靠的特权或缺点。

该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方法的说明,请参阅notify方法。

异常
IllegalMonitorStateException - 如果当前线程不是此对象的监视器的所有者。
另请参见:
notify() , wait()
wait
public final void wait()
                throws InterruptedException
导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。 换句话说,这个方法的行为就好像简单地执行呼叫wait(0) 。
当前的线程必须拥有该对象的显示器。 该线程释放此监视器的所有权,并等待另一个线程通知等待该对象监视器的线程通过调用notify方法或notifyAll方法notifyAll 。 然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

像在一个参数版本中,中断和虚假唤醒是可能的,并且该方法应该始终在循环中使用:

  synchronized (obj) {
         while (<condition does not hold>)
             obj.wait();
         ... // Perform action appropriate to condition
     } 
该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方式的说明,请参阅notify方法。
异常
IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。
InterruptedException - 如果任何线程在当前线程等待通知之前或当前线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
另请参见:
notify() , notifyAll()

class Share{
    private int number = 0;

    public synchronized void incr() throws InterruptedException {

        if (number !=0){
          this.wait();
        }
        number++;
        System.out.println(Thread.currentThread().getName()+"::"+number);
        this.notifyAll();
    }

    public synchronized void decr() throws InterruptedException {

        if (number !=1){
            this.wait();
        }
        number--;
        System.out.println(Thread.currentThread().getName()+"::"+number);
        this.notifyAll();
    }
}

public class MainThreadDemo {
    public static void main(String[] args) {
        Share share = new Share();
        new Thread(()->{
            for(int i =1;i<=10;i++){
                try {
                    share.incr();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"AA").start();

        new Thread(()->{
            for(int i =1;i<=10;i++){
                try {
                    share.decr();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"BB").start();


    }


}

 

最后

以上就是老实身影为你收集整理的多线程通信实现(Synchronized)的全部内容,希望文章能够帮你解决多线程通信实现(Synchronized)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部