Измерьте время состязания в замках

1

Я хочу измерить время разговора для разных видов блокировки. Этот пример предназначен для блокировки 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);
    }
}
}
Теги:
multithreading
locking
profiling

1 ответ

1

Как вы писали, вы измеряете время выполнения между двумя точками, а не конфликтом блокировки.

Вам лучше использовать вкладку "Темы" в Visual VM.

Взгляните на это:

http://visualvm.java.net/threads.html

  • 0
    Я хочу измерить как общее время выполнения, так и время конфликта блокировки. Я запутался, как это сделать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню