这似乎是一个非常基本的问题,但我找不到明确的确认.
假设我有一个类本身正确同步:
public class SyncClass {
private int field;
public synchronized void doSomething() {
field = field * 2;
}
public synchronized void doSomethingElse() {
field = field * 3;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我需要引用该类的实例,在线程之间共享,我仍然需要声明该实例是volatile还是final,我是对的吗?如:
public class MainClass { // previously OuterClass
public static void main(String [ ] args) {
final SyncClass mySharedObject = new SyncClass();
new Thread(new Runnable() {
public void run() {
mySharedObject.doSomething();
}
}).start();
new Thread(new Runnable() {
public void run() {
mySharedObject.doSomethingElse();
}
}).start(); …Run Code Online (Sandbox Code Playgroud) 我需要在 Android 设备上检测 WiFi 网络上的本地 IP 地址和子网掩码(以便严格计算本地子网的 UDP 广播地址)。
当设备连接到接入点时,以下功能正常工作:
// Only works when NOT tethering
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
if (dhcp == null)
throw new IOException("No DHCPInfo on WiFi side.");
foo(dhcp.ipAddress, dhcp.netmask);
Run Code Online (Sandbox Code Playgroud)
但当 Android 设备通过网络共享提供接入点时,它不起作用:当 Android 设备是 DCHP 服务器的客户端时,DhcpInfo 似乎包含由 DCHP 服务器设置的信息,而不是当 Android 设备本身提供 DHCP 服务时。在网络共享中,我能找到的最有希望的解决方案是:
// No way to get subnet mask
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
if (info == null)
throw new IOException("No connection info on …Run Code Online (Sandbox Code Playgroud)