Я хочу измерить время разговора для разных видов блокировки. Этот пример предназначен для блокировки 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);
}
}
}
Как вы писали, вы измеряете время выполнения между двумя точками, а не конфликтом блокировки.
Вам лучше использовать вкладку "Темы" в Visual VM.
Взгляните на это: