请问一下多线程的加锁问题

avatar 237309
wjw779
4632
10
学长学姐好,我想请问一道多线程的加锁问题{:4_112:}

题目是大意是,多线程实现一个class,其中有两个方法,fire()和reg_cb(), fire()设置flag,当flag = false时由reg_cb()存事件不执行,当flag = true时reg_cb()存的事件被执行,并且新来的事件也不用存了直接可以执行。我的问题是下面这个连个优化一个把set flag写在了lock+unlock的前面,一个把set flag写在了lock+unlock的后面,请问这两种写法作用是什么,优化了什么呢,谢谢解答{:4_112:}

public class event{
Queue eventQueue = new LinkedList<>();
boolean isFired = false;
Lock lock;
public void reg_cb(callback cb) {
lock.lock();
if (!isFired){
eventQueue.offer(cb);
lock.unlock();
}else{
lock.unlock();
cb.call();
}
}
//Version 1:
public void fire(){
lock.lock();
lock.unlock();
isFired = true;
while (!eventQueue.isEmpty()){
callback cb = eventQueue.poll();
cb.call();
}
}
//Version 1:
public void fire(){
lock.lock();
lock.unlock();
isFired = true;
while (!eventQueue.isEmpty()){
callback cb = eventQueue.poll();
cb.call();
}
}
//Version 1:
public void fire(){
lock.lock();
lock.unlock();
isFired = true;
while (!eventQueue.isEmpty()){
callback cb = eventQueue.poll();
cb.call();
}
}

//Version 2:
public void fire(){
isFired = true;
lock.lock();
lock.unlock();
while (!eventQueue.isEmpty()){
callback cb = eventQueue.poll();
cb.call();
}
}

}
  • 2
10条回复