IF和赋值语句是线程安全的

时间:2018-11-15 18:16:24

标签: java multithreading thread-safety

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是否未声明为同步的? 抱歉,我更正了密码

1 个答案:

答案 0 :(得分:0)

如果您不在提供的代码中触摸列表,则是线程安全的。如果您不确定,请提供所有代码。

简短说明:

方法foo使用一个List对象,该对象可以在线程之间共享,但是对象实例化期间创建了列表,因此在写入和读取之间存在HB。该方法本身是同步的,因此每次读取和写入列表之间都存在HB关系。

在您的testtest2方法中,您不使用任何可以在不同线程之间共享的对象,并且您仅使用线程安全的foo方法,因此这些方法是threadag。

PS:但是,如果您修改列表字段或在其他方法中使用列表,则取决于您执行的方式。