关于java同步的简单问题

Mar*_*tin 2 java synchronization

我想使用旧方式(int i ...)循环遍历java List,因为对于给定的i和循环迭代,我想访问相对于i的几个元素.然后我不能使用(对象o:对象)列表迭代器.

在执行时,如何确保没有其他代码可以访问列表?

我试过了

synchronized(path.getPoints()){
    for (int i = 0; i < path.getPoints().size(); i++){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

其中path是保存列表的对象,也是

synchronized(path){
    for (int i = 0; i < path.getPoints().size(); i++){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

并且

synchronized(this){
    for (int i = 0; i < path.getPoints().size(); i++){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

其中"this"是想要在没有同步问题的情况下完全呈现路径的渲染器.

提前致谢,

马丁

Mic*_*rdt 7

在执行时,如何确保没有其他代码可以访问列表?

通过确保所有其他代码同步在同一对象上.synchronized(path.getPoints())是最好的选择.getPoints()返回包含的列表可能是一个好主意Collections.synchronizedList()- 然后您不需要显式同步简单get()add()调用,但仍需要迭代的同步.

复杂?是啊.这就是共享内存多线程编程被认为非常困难的原因.