this 引用在构造过程中转义问题(Brian Goetz 和其他人在《Java 并发实践》中称为)是否影响单线程程序还是只影响多线程程序?我的意思是,如果我的类不应该是线程安全的,那么在构造过程中让 this 引用转义可以吗?
编辑:例如,这里:
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:我的问题的动机是插件 WindowBuilder for Eclipse 在 JFrame 的构造函数中创建(或似乎创建...)动作侦听器,并默认将匿名类传递给这些侦听器,从而允许 this 引用转义...
在调试我的应用程序时,直接进入程序执行周期的下一步的方法是单击“Step Into”。问题是我几乎总是在 Java 类库的类中结束,我对这些类不感兴趣,所以我通过“Step Return”摆脱了那些类。
有没有办法“进入”我的代码但跳过我没有编写的代码?
我有一个庞大的Java类,我希望能够看到所有返回的方法MyOwnDataType.我看到一个人可以做CTRL + O然后输入一些东西来打印名称与我刚给出的字符串相匹配的方法.
我发现了一个部分解决方案:如果我输入MyOwnDataType,我会得到所有返回的方法,MyOwnDataType并且有一个类型的参数MyOwnDataType.
有没有办法做到这一点(干净利落)?
我在 ModelSim 中收到以下错误:
错误:[..]/test1_toVectorAlignment_rtl.vhd(40):中缀表达式中有歧义类型;t_RAMXx8 或 ieee.std_logic_1164.STD_LOGIC_VECTOR。
ARCHITECTURE rtl OF test1_toVectorAlignment IS
type t_RAMXx8 is array (natural RANGE <>) of std_logic_vector(7 downto 0);
signal RAM28x8: t_RAMXx8(0 to 27);
BEGIN
...
currentIq<=unsigned(RAM28x8(5)(4 downto 0) & RAM28x8(4));
...
END rtl;
Run Code Online (Sandbox Code Playgroud)
实体声明:
ENTITY test1_toVectorAlignment IS
...
currentIq: out unsigned(12 downto 0);
...
END test1_toVectorAlignment;
Run Code Online (Sandbox Code Playgroud)
有人可以用这些信息告诉我如何解决这个问题吗?
我在构造函数中实例化一个内部类,但我不是用它来启动线程或作为事件监听器.例如:
public class Something {
final InnerSomething innerSomething = new InnerSomething();
public Something(Param arg) {
super(arg);
}
private class InnerSomething {...}
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:我复制并粘贴了其他地方的代码,忘了删除"abstract"关键字.
EDIT2:"'this'参考转义"的"我的"定义是Java Concurrency in Practice一书中的一个.
使用上面的代码,我允许'this'引用"escape"吗?
我有以下类,它应该是线程安全的:
public class ShouldBeMadeThreadSafe {
private double[] k = {70.0,70.0};
private double[] b = {10.0,10.0};
private double[] m = {5.0,6.0};
public synchronized void setKX(double kx) {k[0]=kx;}
public synchronized void setKY(double ky) {k[1]=ky;}
public synchronized void setBX(double bx) {b[0]=bx;}
public synchronized void setBY(double by) {b[1]=by;}
public synchronized void setMX(double mx) {m[0]=mx;}
public synchronized void setMY(double my) {m[1]=my;}
public double[] getK() {return Arrays.copyOf(k, k.length);}
public double[] getB() {return Arrays.copyOf(b, b.length);}
public double[] getM() {return Arrays.copyOf(m, m.length);}
}
Run Code Online (Sandbox Code Playgroud)
当然,这在getter中存在可见性问题,因为只有在解锁和锁定监视器之间才能保证之前发生的关系.
显而易见的解决方法是将synchronized关键字添加到getter:
public class OkButIDontLikeDeadlocks …Run Code Online (Sandbox Code Playgroud) 我想获取所有捕获的数据包,其中源或目标IP地址不同于,例如,192.168.0.1.为此我尝试了ip.addr!= 192.168.0.1,但是过滤器变黄了,而不是绿色,所以一定是错的.
怎么能(正确地)完成?
有人能告诉我为什么三元运算符的使用不正确吗?操作数2和3返回一个布尔值.
public class Something {
...
private static final double REFERENCE_FRAME_MID_X = 0;
private static final double REFERENCE_FRAME_MID_Y = 0;
private boolean findInsideOrOutsideGeneralEllipse(Point2D destCirclePos) {
List<Boolean> returnValue = new ArrayList<>();
Point2D referenceFrameCenter = new Point2D.Double(REFERENCE_FRAME_MID_X, REFERENCE_FRAME_MID_Y);
Ellipse2D insideAreaEllipse2D = getEllipse2D(referenceFrameCenter.getX(), referenceFrameCenter.getY(),
destCirclePos.distance(referenceFrameCenter));
// doesn't work
insideAreaEllipse2D.contains(destCirclePos) ? returnValue.add(true) : returnValue.add(false);
// works
if (insideAreaEllipse2D.contains(destCirclePos)) {
returnValue.add(true);
} else {
returnValue.add(false);
}
}
...
}
Run Code Online (Sandbox Code Playgroud) public class ThreadSafe {
private int aField;
public synchronized void setAField(int value) {
aField = value;
}
public synchronized int getAField() {
return aField;
}
}
public class ThreadSafeToo {
private volatile int aField;
public synchronized void setAField(int value) {
aField = value;
}
public int getAField() {
return aField;
}
}
public class DontKnowIfThreadSafeButMostLikelyYes {
private static int aField;
public synchronized void setAField(int value) {
aField = value;
}
public int getAField() {
return aField;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
DontKnowIfThreadSafeButMostLikely是否是线程安全的? …
我有这个:
public void log(Circle circOrig) {
...
}
Run Code Online (Sandbox Code Playgroud)
我试图避免这样做:
private void addPositions(PositionsLogger positionsLogger) {
...
Circle circ = new Circle(0,0,0); //`circ` could be final
circ.setPosition(0,0);
posLogger.log(circ);
...
}
Run Code Online (Sandbox Code Playgroud)
通过做这个:
public static void main(String[] args) {
...
posLogger.log(new (Circle(0, 0, 0).setPosition(0, 0)));
...
}
Run Code Online (Sandbox Code Playgroud)
这显然是编译错误,因为log()需要a Circle而不是a void.
如何避免为这么微不足道的目的声明局部变量?