|
1、由于 move() 与 draw(Graphics g) 方法可能会被两个线程同时调用,那它还是没有解决,“当draw操作使用move方法调用前的y值和move方法调用后的x值绘制一个例子的图形”。
2、protected final Random rng = new Random(); 为什么定义为final?好处具体表现在什么地方?
|
2、protected final Random rng = new Random(); 为什么定义为final?好处具体表现在什么地方?
不太明白这段程序要解决的是哪方面的并发,“当draw操作使用move方法调用前的y值和move方法调用后的x值绘制一个例子的图形”。这句话让人不太理解。
>
> 2、protected final Random rng = new Random();
> 为什么定义为final?好处具体表现在什么地方?
个人理解为:定义为final是为了强制让Particle类的一个实例中只能使用一个rng引用,不允许被转移引用指针,也不允许被null,直到该Particle实例被释放时rng引用才被释放掉. 这么做的目的主要是为了程序逻辑上的安全,当然如果你的记忆力比较好,或者你不想多为将来接受这个程序的人做奉献,要不要final都是一样的.
这儿的并发问题是,若move方法和draw方法同时被连个线程调用。
有可能发现这样的现象:
1、draw 准备绘图时,先获取一个X,
2、同时,move,修改了 x,y的值
4、draw 获取Y,这是获取的X,Y不是一致性的。 只会在一个错误的点显示一个图形。
所以说“当draw操作使用 move方法调用前的y值和move方法调用后的x值绘制一个粒子的图形”。
这儿的并发问题是,若move方法和draw方法同时被两个线程调用。
有可能发现这样的现象:
1、draw 准备绘图时,先获取一个X,
2、同时,move,修改了 x,y的值
4、draw 获取Y,这是获取的X,Y不是一致性的。 只会在一个错误的点显示一个图形。
所以说“当draw操作使用 move方法调用前的y值和move方法调用后的x值绘制一个粒子的图形”。
|
而在move()动作上有一个方法锁,在此方法操作的时候是不允许x值和y值被两个线程乱改的.
因为在写的时候x,y是一致的,而在读的时候该x,y又不允许被修改,所以说它解决了你所担心的这个并发问题
|
一旦任意线程进入
|
|
packetListeners.put(listener,element); |