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