我想测量不同类型锁的争用时间。这个例子 用于TAS锁。我无法弄清楚如何去做。我用 ctime 来衡量一个线程等待一个锁的时间,但似乎我要去 关于它以错误的方式。由于在ctime1之后或在ctime2之前如果可以切换,因此我将无法获得实际的争用时间。我是以正确的方式接近它还是还有其他方法可以解决这个问题?
class Stack{
int stack[];
int top, size;
void push(int e);
int pop();
}
class Pusher implements Runnable{
Thread t;
Stack s;
TASLock lock;
long ctime, etime;
Pusher(Stack temp, TASLock tempLock){
t = new Thread(this);
s = temp;
lock = tempLock;
ctime = etime = 0;
t.start();
}
public void run(){
long ctime1, ctime2, etime1, etime2;
int id = (int)t.getId();
int times = 10000;
etime1 = System.nanoTime();
while(times-->0){
//System.out.println("Pushing - "+t.getName());
ctime1 = System.nanoTime();
lock.lock();
ctime2 = System.nanoTime();
ctime += ctime2 - ctime1;
try{
s.push(id);
} finally { lock.unlock(); }
}
etime2 = System.nanoTime();
etime = etime2-etime1;
System.out.println(t.getName()+" Waiting time : "+ctime);
System.out.println(t.getName()+" Execution time : "+etime);
}
}
class Popper implements Runnable{
Works the same way as push...
}
class StackDriver{
public static void main(String[] args){
Stack s = new Stack(1000);
TASLock lock = new TASLock();
int i, noOfThreads = Integer.parseInt(args[0]);
for(i=0; i<noOfThreads; i++){
if(i%2 == 0)
new Pusher(s,lock);
else
new Popper(s,lock);
}
}
}
答案 0 :(得分:1)