读《图解java多线程设计模式》总结--Balking

1,从名字上看,balk是拒绝的意思,目的是确保在多线程条件下各线程能正常操作共享资源,该模式有点类似Guarded Suspension模式,唯一不同的是,Guarded Suspension当不满足守护条件的情况下会触发线程等待,而Balking当不满足守护条件时直接返回,不会触发线程等待。

2,适用范围,Balking模式的特点就是不进行等待,当守护条件不成立的时候,要立即进行其他操作,就可以使用该模式,由于不存在线程等待,所以能够提高程序的响应性。

3,实现方式,与Guarded Suspension模式类似,同样有守护方法(GuardedMethod)和改变守护条件方法(StateChangeingMethod),当守护条件不满足,守护方法就直接return。

4,代码实现

1)定义一个Guard类,里面的GuardedMethod检查共享资源是否等于5(守护条件),如果守护条件满足,则显示“读取该共享资源值”,如果守护条件不满足,则显示“ 触发了balking”。另外StateChangeingMethod会交替设置共享资源的值,如果共享资源的值等于5就设置为0,如果等于0就设置为5

 

package balking.study;

public class Guard {

    int sharedResource=0;
    public synchronized void  guardedMethod()
    {
        if(sharedResource!=5)
        {
            System.out.println("Thread name:"+Thread.currentThread().getName()+" shared resource is not equal 5 balking");
            return ;
        }
        System.out.println("Thread name:"+Thread.currentThread().getName()+" read shared resource:"+ sharedResource);
    }


    public synchronized void  stateChangeingMethod()
    {
        if(sharedResource==5)
           sharedResource=0;
        else
            sharedResource=5;
        System.out.println("Thread name:"+Thread.currentThread().getName()+" set shared resource:"+ sharedResource);

    }
}

 

2) 启动两个线程,线程0触发10次 guardedMethod(),线程1触发10次stateChangeingMethod,每次触发后都稍等100毫秒

 

package balking.study;

public class Balking {

    public static void main(String[] args) {
       Guard guard=new Guard();

        Thread thead0=new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                       for(int i=0;i<10;i++) {
                            guard.guardedMethod();
                           try {
                               Thread.sleep(100);
                           } catch (InterruptedException e) {
                               e.printStackTrace();
                           }
                       }
                    }
                }
                );


        Thread thead1=new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        for(int i=0;i<10;i++) {
                          guard.stateChangeingMethod();
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                      }
                    }
                }
        );
        thead0.start();
        thead1.start();
    }
}

 

3)运行结果

Thread name:Thread-0 shared resource is not equal 5 balking  //守护条件不满足,线程0直接返回
Thread name:Thread-1 set shared resource:5   //线程1改变守护条件
Thread name:Thread-0 read shared resource:5 //线程0第2次触发守护方法,此时守护条件满足,显示读取共享资源值
Thread name:Thread-1 set shared resource:0
Thread name:Thread-1 set shared resource:5
Thread name:Thread-0 read shared resource:5
Thread name:Thread-1 set shared resource:0
Thread name:Thread-0 shared resource is not equal 5 balking
Thread name:Thread-1 set shared resource:5
Thread name:Thread-0 read shared resource:5
Thread name:Thread-1 set shared resource:0
Thread name:Thread-0 shared resource is not equal 5 balking
Thread name:Thread-0 shared resource is not equal 5 balking
Thread name:Thread-1 set shared resource:5
Thread name:Thread-1 set shared resource:0
Thread name:Thread-0 shared resource is not equal 5 balking
Thread name:Thread-0 shared resource is not equal 5 balking
Thread name:Thread-1 set shared resource:5
Thread name:Thread-0 read shared resource:5
Thread name:Thread-1 set shared resource:0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值