0

クラスXには と の 2 つのメソッドがtestありtest1ます。

t1との 2 つのスレッドを作成しましたt2。スレッドt1testメソッドにアクセスしており、同じオブジェクトのメソッドにt2アクセスしています。同期したメソッドにアクセスしているtest1場合は、オブジェクトのロックを取得します。t1test

同じオブジェクトのメソッドにt2アクセスできますか? ロックされているtest1場合、このメソッドにアクセスできるのはなぜですか?t1

次のコードを実行している場合

            X x = new X();
           new MyThread(x).start(); // It execute test() method
       new MyThread1(x).start();// It execute test1() method





class X 
{
    String a  = "varsha";
    public synchronized void test ()
    {
        try 
        {
            Thread.sleep (6000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace ();
        }
    } 
    public void test1 ()
    {
        synchronized (a)
        {
        }
    } 
}
4

5 に答える 5

3

2 つの異なるロックがあります。

  • test()ロックthis;
  • test1()ロックしthis.aます。

2 つのロックは完全に独立しているため、2 つのメソッドを同時に呼び出すことができます。

于 2013-03-14T07:16:06.243 に答える
1

コードは次と同等です。

class X 
{
    String a  = "varsha";
    public void test ()
    {
        synchronized (this)
        {
            try
            {
                Thread.sleep (6000);
            }
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
        }
    } 

    public void test1 ()
    {
        synchronized(a)
        {
        }
    } 
}

したがって、これらのメソッドは異なるオブジェクト ( thisvs a) で同期しているため、互いにロックすることなく同時に実行できます。

メソッドは静的であり、それを使用するために のインスタンスは必要ないため、 に置き換えたことに注意してThread.currentThread ().sleep (6000)ください。Thread.sleep (6000)sleepThread

于 2013-03-14T07:17:00.450 に答える
0
class X {

  String a  = "varsha";

   public synchronized void test(){

   try {             
                  //if you are modifying the instance variable here
                  // then the test1() synchronized block will 
                 //not be given lock permission to t2 thread
                 // synchronization is for thread safety.

                 // In your example you are not modifying the instance variable.

   } catch (InterruptedException e) {
    e.printStackTrace();
   }
 } 
 public  void test1(){
   synchronized(a){
   }
 } 
}
于 2013-03-14T07:29:48.737 に答える
0

これが実際に起こっていることです。
Java のすべてのオブジェクトには「モニター ロック」があります。この場合はオブジェクト「x」です。

次の順序でこのロックを取得しようとする 2 つのスレッド (MyThread と MyThread1) があります。

キューがあるとします。最初に MyThread を開始し、次に MyThread1 を開始したため、MyThread はこのキューの MyThread1 の前にあります。

MyThread は最初にロックを取得し、実行を開始します。それに対して sleep() メソッドを呼び出しました。これにより、MyThread の状態が「実行状態」から「待機状態」、「準備完了状態」に変わります。この時点で実行状態ではないため、ロックが解除されます。この時点で、MyThread1 はキューの先頭にあり、ロックを取得して実行を開始します。

これは、「コンテキスト スイッチ」の概念に似ています。本を参照してください - オペレーティング システムの内部と設計。

于 2016-07-20T01:48:24.927 に答える
-1

メソッドを同期済みとしてマークすると、そのメソッドのオブジェクトがロックされます。つまり、他のスレッドはそのオブジェクトの PARTICULAR メソッドにアクセスできません。あなたの場合、他のスレッドはテストメソッドにアクセスできません。もちろん、test1 メソッドにはアクセスできます。

于 2013-03-14T07:21:28.930 に答える