我不喜欢用synchronized(this)锁定我的代码,所以我正在尝试使用AtomicBooleans。在代码片段中,XMPPConnectionIF.connect()建立到远程服务器的套接字连接。请注意,变量_connecting仅在connect()方法中使用;而_connected用于需要使用_xmppConn的所有其他方法。我的问题列在下面的代码片段之后。
private final AtomicBoolean _connecting = new AtomicBoolean( false );
private final AtomicBoolean _connected = new AtomicBoolean( false );
private final AtomicBoolean _shuttingDown = new AtomicBoolean( false );
private XMPPConnection _xmppConn;
/**
* @throws XMPPFault if failed to connect
*/
public void connect()
{
// 1) you can only connect once
if( _connected.get() )
return;
// 2) if we're in the middle of completing a connection,
// you're out of luck
if( _connecting.compareAndSet( false, true ) )
{
XMPPConnectionIF aXmppConnection = _xmppConnProvider.get();
boolean encounteredFault = false;
try
{
aXmppConnection.connect(); // may throw XMPPException
aXmppConnection.login( "user", "password" ); // may throw XMPPException
_connected.compareAndSet( false, true );
_xmppConn = aXmppConnection;
}
catch( XMPPException xmppe )
{
encounteredFault = true;
throw new XMPPFault( "failed due to", xmppe );
}
finally
{
if( encounteredFault )
{
_connected.set( false );
_connecting.set( false );
}
else
_connecting.compareAndSet( true, false );
}
}
}
根据我的代码,如果 2 个线程同时尝试调用connect() ,那么线程安全是否允许只允许一次连接尝试。
在 finally 块中,我连续执行了两个 AtomicBoolean.set(..) ,会不会有问题,因为在这两个原子调用之间的间隙期间,一些线程可能会在其他方法中调用_connected.get() ?
使用_xmppConn时,我应该做一个synchronized( _xmppConn )吗?
更新在方法中添加了缺少的登录调用。