0

静的変数データ(定数ではない)を共有することになっている2つのスレッドがあり、それに応じて実行する必要があります。しかし、これらのスレッドはどれも、静的変数の独自の状態を維持する以外に、更新された静的変数データを取得することはできません。

静的変数をシングルトンに配置し、それを揮発性として宣言しましたが、結果は同じです。

誰かがこのアプローチの問題と、これを解決するために何ができるかを提案できますか?

Thx、Aj

below is the code

following is the singleton class

***************************************************************************
public class ThreadFinder {

    public static String pageName;//HashMap threadInfo = new HashMap(); //new HashMap();

private static ThreadFinder singletonObject;
/** A private Constructor prevents any other class from instantiating. */
private ThreadFinder () {
    }
public static synchronized ThreadFinder getSingletonObject() {
    if (singletonObject == null) {
        singletonObject = new ThreadFinder();
    }
    return singletonObject;
}
public static synchronized void setPageName(String Name) {

    pageName = Name;
    //return;
}
public static synchronized String getPageName() {

    return pageName;
    //return;
}
public Object clone() throws CloneNotSupportedException {
    throw new CloneNotSupportedException();
}
//public static void main(String args[])
//{
    //ThreadFinder.getSingletonObject().setPageName("IDEN");
    //System.out.println("page name--------->"+ThreadFinder.getSingletonObject().getPageName());
    //ThreadFinder.getSingletonObject().setPageName("THER");
    //System.out.println("page name--------->"+ThreadFinder.getSingletonObject().getPageName());
//}
}

********************************************************************************

from page 1 below code executes and sets the singleton page variable value to "A" and first pollertimer thread uses the page value as A.

m_poller.setModbusMaster(this.m_connection.getModbusMaster());
m_poller.addListener(this);
ThreadFinder.getSingletonObject().setPageName("A");  //Setting the page name here
PollerTimer polerTimerThread = new PollerTimer(period,"A");  // this is thread

*********************************************************************************

from page2 below code executes and sets the singleton page variable value to "B" and second pollertimer thread uses the page value as B.

m_poller.setModbusMaster(this.m_connection.getModbusMaster());
m_poller.addListener(this);
ThreadFinder.getSingletonObject().setPageName("B");  //Setting the page name here
PollerTimer polerTimerThread = new PollerTimer(period,"B");  // this is thread

***********************************************************************************

Now when first pollertimer thread queries page value using getPageName() it is getting value A instead of B, though it was updated to B by the second thread.
4

1 に答える 1

3

シングルトン揮発性への参照を宣言しても、その状態を変更する場合は役に立ちません。揮発性変数によって参照される不変のシングルトンを使用するか、そのシングルトン内の個々の変数を揮発性にする必要があります。そして、それはあなたが原子性の問題も持っていない場合にのみです。2番目のアプローチは、シングルトンをまったく持たないのとほとんど同じで、static volatileグローバル変数の数だけです。

于 2012-07-16T11:33:43.063 に答える