/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2013, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.core.issue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
/**
* A runnable which behaves differently depending on the desired locking model.
*
* @author Joern Huxhorn
* @author Ceki Gulcu
*/
public class SelectiveLockRunnable extends RunnableWithCounterAndDone {
enum LockingModel {
NOLOCK, SYNC, FAIR, UNFAIR;
}
static Object LOCK = new Object();
static Lock FAIR_LOCK = new ReentrantLock(true);
static Lock UNFAIR_LOCK = new ReentrantLock(false);
LockingModel model;
SelectiveLockRunnable(LockingModel model) {
this.model = model;
}
public void run() {
switch (model) {
case NOLOCK:
nolockRun();
break;
case SYNC:
synchronizedRun();
break;
case FAIR:
fairLockRun();
break;
case UNFAIR:
unfairLockRun();
break;
}
}
void fairLockRun() {
for (;;) {
FAIR_LOCK.lock();
counter++;
FAIR_LOCK.unlock();
if (done) {
return;
}
}
}
void unfairLockRun() {
for (;;) {
UNFAIR_LOCK.lock();
counter++;
UNFAIR_LOCK.unlock();
if (done) {
return;
}
}
}
void nolockRun() {
for (;;) {
counter++;
if (done) {
return;
}
}
}
void synchronizedRun() {
for (;;) {
synchronized (LOCK) {
counter++;
}
if (done) {
return;
}
}
}
@Override
public String toString() {
return "SelectiveLockRunnable "+model;
}
}