private LinkedList<Integer> list = new LinkedList<Integer>();
private synchronized int foo(int x){
if(x>=0){ //do something
list.add(x);
return x }
else {
int tmp = list.removeFirst();
return tmp;
}
return -1;
}
public void test(int id)
{
if(foo(id)==-1)
//do something
}
public void test2(int id){
int y=foo(id);
System.out.println(id+" "+ y);
}
如果test和test2方法已被多个线程访问是线程安全的,而test和test2是否未声明为同步的? 抱歉,我更正了密码
答案 0 :(得分:0)
如果您不在提供的代码中触摸列表,则是线程安全的。如果您不确定,请提供所有代码。
方法foo
使用一个List
对象,该对象可以在线程之间共享,但是对象实例化期间创建了列表,因此在写入和读取之间存在HB。该方法本身是同步的,因此每次读取和写入列表之间都存在HB关系。
在您的test
和test2
方法中,您不使用任何可以在不同线程之间共享的对象,并且您仅使用线程安全的foo方法,因此这些方法是threadag。
PS:但是,如果您修改列表字段或在其他方法中使用列表,则取决于您执行的方式。