0

スレッドから同時に同じ機能を実行することは可能ですか。Javaメソッド領域が同じであるため、同じ関数を複数回呼び出すと待機状態になる可能性があるのではないかと疑っていますが、正しいですか?

4

3 に答える 3

2

うん。デフォルトでメソッドの同時実行を行うことができます。同時実行を停止するには、synchronized キーワードまたは同時実行クラスを使用する必要があります

于 2012-05-23T04:57:48.067 に答える
1

はい、同期を使用していない限り可能です。ロックを待つ必要はありません。これはデフォルトの動作であり、ロックやスレッド実行をインターリーブすることはできません。

ただし、スレッド スケジューラでは、特定の時間に 1 つのスレッドを実行できることに注意してください。

デフォルトでは、同期なしの同時アクセスは待機なしの動作です。

実証するサンプル

public class MyThread implements Runnable {

    private MyThreadInvocation  threadInvocation    = null;

    public MyThread(MyThreadInvocation threadInvocation) {
        this.threadInvocation = threadInvocation;
    }

    @Override
    public void run() {
        System.out.println("Calling from : " + Thread.currentThread().getName());
        this.threadInvocation.printMessage();
    }
}


public class MyThreadInvocation {
    public void printMessage(){
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        MyThreadInvocation myThreadInvocation = new MyThreadInvocation();
        Thread t1 = new Thread(new MyThread(myThreadInvocation));
        t1.setName("First Thread");

        Thread t2 = new Thread(new MyThread(myThreadInvocation));
        t2.setName("Second Thread");

        Thread t3 = new Thread(new MyThread(myThreadInvocation));
        t3.setName("Third Thread");

        t1.start();
        t2.start();
        t3.start();
    }
}
于 2012-05-23T04:57:45.533 に答える
1

はい、複数のスレッドから同時に同じ関数を呼び出すことは完全に可能です。各スレッドには独自のスタックがあります。つまり、関数で使用されるローカル変数の独自のコピーを取得します。

マルチコア マシンでは、複数のスレッドが同じ関数で同時に実行されることさえあります。

もちろん、複数のスレッドから同時に同じ関数を呼び出すと、それらが同じ変更可能な状態 (たとえば、両方のスレッドが読み書きするオブジェクトのフィールド) にアクセスする場合に問題が発生する可能性があります。これらの問題から保護したい場合は、何らかの形式のロックまたは同期を使用する必要があります。

于 2012-05-23T05:04:31.277 に答える