[ 
https://issues.apache.org/jira/browse/HAMA-972?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14727382#comment-14727382
 ] 

JongYoon Lim commented on HAMA-972:
-----------------------------------

+1 Thanks for the helpful link. It describes how to use the *condition wait 
method*(Object.wait).
{code} 
void stateDependentMethod() throws InterruptedException {
  // ...
  synchronized (lock) {
    while (!conditionPredicate()) {
      lock.wait()
    }
  }
  // ...
}
{code}
But I concern that the *lock* is a lock which is shared between threads. So, In 
my opinion, it should not be a local variable. 

In the *ArrayBlockingQueue* of JDK, we can see a similar usage as below. 
I can see it uses a global lock.. WDYT? 
{code} 
public boolean offer(E e) {
    checkNotNull(e);
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        if (count == items.length)
            return false;
        else {
            insert(e);
            return true;
        }
    } finally {
        lock.unlock();
    }
}

public void put(E e) throws InterruptedException {
    checkNotNull(e);
    final ReentrantLock lock = this.lock;
    lock.lockInterruptibly();
    try {
        while (count == items.length)
            notFull.await();
        insert(e);
    } finally {
        lock.unlock();
    }
}
{code}

> Synchronization on local variable 
> ----------------------------------
>
>                 Key: HAMA-972
>                 URL: https://issues.apache.org/jira/browse/HAMA-972
>             Project: Hama
>          Issue Type: Bug
>          Components: bsp core
>            Reporter: JongYoon Lim
>            Priority: Minor
>
> I'm not sure that the synchronization of the following code is proper. 
> In the code, it uses the *call variable* as a lock. But it's a local 
> variable. So whenever this function is called, the lock is changed. I think 
> this is a bug... What do you think..? Is there anything that I'm missing..? 
> {code}
> // Client.java 
> public Writable call(Writable param, ConnectionId remoteId)
>       throws InterruptedException, IOException {
>     Call call = new Call(param);
>     Connection connection = getConnection(remoteId, call);
>     connection.sendParam(call); // send the parameter
>     boolean interrupted = false;
>     synchronized (call) {
>       int callFailCount = 0;
>       while (!call.done) {
>         try {
>           call.wait(1000); // wait for the result
>           // prevent client hang from response error
>           if (callFailCount++ == IPC_CLIENT_CONNECT_MAX_RETRIES_DEFAULT)
>             break;
>         } catch (InterruptedException ie) {
>           interrupted = true;
>         }
>       }
>       if (interrupted) {
>         // set the interrupt flag now that we are done waiting
>         Thread.currentThread().interrupt();
>       }
>       if (call.error != null) {
>         if (call.error instanceof RemoteException) {
>           call.error.fillInStackTrace();
>           throw call.error;
>         } else { // local exception
>           // use the connection because it will reflect an ip change,
>           // unlike
>           // the remoteId
>           throw wrapException(connection.getRemoteAddress(), call.error);
>         }
>       } else {
>         return call.value;
>       }
>     }
>   }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to