You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hama.apache.org by "Edward J. Yoon (JIRA)" <ji...@apache.org> on 2015/09/02 12:44:45 UTC
[jira] [Commented] (HAMA-972) Synchronization on local variable
[ https://issues.apache.org/jira/browse/HAMA-972?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14727159#comment-14727159 ]
Edward J. Yoon commented on HAMA-972:
-------------------------------------
Hi, I think you can find the answer from here - http://stackoverflow.com/questions/2779484/why-must-wait-always-be-in-synchronized-block
> 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)