在java中正确使用同步[英] synchronized in java - Proper use

问题描述

我正在构建一个用于多进程(线程)的简单程序.

我的问题更容易理解 - 当我必须使用保留字同步?

我需要在影响骨骼变量的任何方法中使用这个词吗?

我知道我可以把它放在任何非静态的方法上,但我想了解更多.

谢谢!

代码如下:

public class Container {
// *** data members ***
public static final int INIT_SIZE=10;  // the first (init) size of the set.
public static final int RESCALE=10;   // the re-scale factor of this set.
private int _sp=0;
public Object[] _data;
/************ Constructors ************/
public Container(){
    _sp=0;
    _data = new Object[INIT_SIZE];
}
public Container(Container other) {  // copy constructor
    this();
    for(int i=0;i<other.size();i++) this.add(other.at(i));
}

/** return true is this collection is empty, else return false. */
public synchronized boolean isEmpty() {return _sp==0;}

/** add an Object to this set */
public synchronized void add (Object p){
    if (_sp==_data.length) rescale(RESCALE);
    _data[_sp] = p;  // shellow copy semantic.
    _sp++;
}   

/** returns the actual amount of Objects contained in this collection */
public synchronized int size() {return _sp;}

/** returns true if this container contains an element which is equals to ob */
public synchronized boolean isMember(Object ob) {
    return get(ob)!=-1;
}

/** return the index of the first object which equals ob, if none returns -1 */
public synchronized int get(Object ob) {
    int ans=-1;
    for(int i=0;i<size();i=i+1)
        if(at(i).equals(ob)) return i;
    return ans;
}

/** returns the element located at the ind place in this container (null if out of range) */
public synchronized Object at(int p){
    if (p>=0 && p<size()) return _data[p];
    else return null;
}

推荐答案

使一个类对多线程访问安全是一个复杂的主题.如果你不是为了学习线程而做的,你应该尝试找到一个为你做这件事的库.

话虽如此,一个起点是想象两个独立的线程以交替的方式逐行执行一个方法,看看会出现什么问题.例如,上面编写的 add() 方法容易受到数据破坏.想象一下 thread1 和 thread2 或多或少同时调用 add().如果 thread1 运行第 2 行并且在它到达第 3 行之前,thread2 运行第 2 行,那么 thread2 将覆盖 thread1 的值.因此,您需要一些方法来防止线程像那样交错.另一方面,isEmpty() 方法不需要同步,因为只有一条指令将一个值与 0 进行比较.同样,很难做到这一点.

本文地址:https://www.itbaoku.cn/post/978579.html