簡體   English   中英

多線程中的同步塊

[英]synchronized block in Multithreading

我有一個方法,該方法調用該方法的2個synchronize塊,並提供了代碼,

    private static int count1 = 0;
    private static int count2 = 0;

    public synchronized static void add() {
    count1++;
    System.out.println("T name: " + Thread.currentThread().getName()
    + "count1 = " + count1);
}

public synchronized static void addAgain() {
    count2++;
    System.out.println("T name: " + Thread.currentThread().getName()
            + "count1 = " + count2);
}

    public static void compute() {
        for(int i=0;i<100;++i) {
            add();
            addAgain();
        }
    }

在這里,我們定義2個線程,並從每個線程中調用compute方法。 下面提供了代碼段,

        Thread t1 = new Thread(() -> compute());
        Thread t2 = new Thread(() -> compute());

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

使用提供的代碼,我有三個問題:

  1. 當線程調用compute方法時,它是否可以訪問內部的兩個synchronized方法並執行增量操作?

  2. 如果一個線程可以訪問for循環,它是完成for循環還是在競爭之前與其他線程共享?

  3. 如果是這種情況,我假設另一個線程處於等待階段,並且不會做太多事情。 這個對嗎?

為了討論,我在運行后得到的結果是:

    Thread name: Thread-0  count1 value = 1
Thread name: Thread-1  count1 value = 2
Thread name: Thread-1 count2 value = 1
Thread name: Thread-1  count1 value = 3
Thread name: Thread-1 count2 value = 2
Thread name: Thread-1  count1 value = 4
Thread name: Thread-1 count2 value = 3
Thread name: Thread-1  count1 value = 5
Thread name: Thread-1 count2 value = 4
Thread name: Thread-1  count1 value = 6
Thread name: Thread-1 count2 value = 5
Thread name: Thread-1  count1 value = 7
Thread name: Thread-1 count2 value = 6
Thread name: Thread-1  count1 value = 8
Thread name: Thread-1 count2 value = 7
Thread name: Thread-1  count1 value = 9
Thread name: Thread-1 count2 value = 8
Thread name: Thread-1  count1 value = 10
Thread name: Thread-1 count2 value = 9
Thread name: Thread-1  count1 value = 11
Thread name: Thread-1 count2 value = 10
Thread name: Thread-1  count1 value = 12
Thread name: Thread-1 count2 value = 11
Thread name: Thread-1  count1 value = 13
Thread name: Thread-1 count2 value = 12
Thread name: Thread-1  count1 value = 14
Thread name: Thread-1 count2 value = 13
Thread name: Thread-1  count1 value = 15
Thread name: Thread-1 count2 value = 14
Thread name: Thread-1  count1 value = 16
Thread name: Thread-1 count2 value = 15
Thread name: Thread-1  count1 value = 17
Thread name: Thread-1 count2 value = 16
Thread name: Thread-1  count1 value = 18
Thread name: Thread-1 count2 value = 17
Thread name: Thread-1  count1 value = 19
Thread name: Thread-1 count2 value = 18
Thread name: Thread-1  count1 value = 20
Thread name: Thread-0 count2 value = 19
Thread name: Thread-0  count1 value = 21
Thread name: Thread-0 count2 value = 20
Thread name: Thread-0  count1 value = 22
Thread name: Thread-0 count2 value = 21
Thread name: Thread-0  count1 value = 23
Thread name: Thread-0 count2 value = 22
Thread name: Thread-0  count1 value = 24
Thread name: Thread-0 count2 value = 23
Thread name: Thread-0  count1 value = 25
Thread name: Thread-0 count2 value = 24
Thread name: Thread-0  count1 value = 26
Thread name: Thread-0 count2 value = 25
Thread name: Thread-0  count1 value = 27
Thread name: Thread-0 count2 value = 26
Thread name: Thread-0  count1 value = 28
Thread name: Thread-0 count2 value = 27
Thread name: Thread-0  count1 value = 29
Thread name: Thread-0 count2 value = 28
Thread name: Thread-0  count1 value = 30
Thread name: Thread-0 count2 value = 29
Thread name: Thread-0  count1 value = 31
Thread name: Thread-0 count2 value = 30
Thread name: Thread-0  count1 value = 32
Thread name: Thread-0 count2 value = 31
Thread name: Thread-0  count1 value = 33
Thread name: Thread-0 count2 value = 32
Thread name: Thread-0  count1 value = 34
Thread name: Thread-0 count2 value = 33
Thread name: Thread-0  count1 value = 35
Thread name: Thread-0 count2 value = 34
Thread name: Thread-0  count1 value = 36
Thread name: Thread-0 count2 value = 35
Thread name: Thread-0  count1 value = 37
Thread name: Thread-0 count2 value = 36
Thread name: Thread-0  count1 value = 38
Thread name: Thread-0 count2 value = 37
Thread name: Thread-0  count1 value = 39
Thread name: Thread-0 count2 value = 38
Thread name: Thread-0  count1 value = 40
Thread name: Thread-0 count2 value = 39
Thread name: Thread-0  count1 value = 41
Thread name: Thread-0 count2 value = 40
Thread name: Thread-0  count1 value = 42
Thread name: Thread-0 count2 value = 41
Thread name: Thread-0  count1 value = 43
Thread name: Thread-0 count2 value = 42
Thread name: Thread-0  count1 value = 44
Thread name: Thread-0 count2 value = 43
Thread name: Thread-0  count1 value = 45
Thread name: Thread-0 count2 value = 44
Thread name: Thread-0  count1 value = 46
Thread name: Thread-0 count2 value = 45
Thread name: Thread-0  count1 value = 47
Thread name: Thread-0 count2 value = 46
Thread name: Thread-0  count1 value = 48
Thread name: Thread-0 count2 value = 47
Thread name: Thread-0  count1 value = 49
Thread name: Thread-0 count2 value = 48
Thread name: Thread-0  count1 value = 50
Thread name: Thread-0 count2 value = 49
Thread name: Thread-0  count1 value = 51
Thread name: Thread-0 count2 value = 50
Thread name: Thread-0  count1 value = 52
Thread name: Thread-0 count2 value = 51
Thread name: Thread-0  count1 value = 53
Thread name: Thread-0 count2 value = 52
Thread name: Thread-0  count1 value = 54
Thread name: Thread-0 count2 value = 53
Thread name: Thread-0  count1 value = 55
Thread name: Thread-0 count2 value = 54
Thread name: Thread-0  count1 value = 56
Thread name: Thread-0 count2 value = 55
Thread name: Thread-0  count1 value = 57
Thread name: Thread-0 count2 value = 56
Thread name: Thread-0  count1 value = 58
Thread name: Thread-0 count2 value = 57
Thread name: Thread-0  count1 value = 59
Thread name: Thread-0 count2 value = 58
Thread name: Thread-0  count1 value = 60
Thread name: Thread-0 count2 value = 59
Thread name: Thread-0  count1 value = 61
Thread name: Thread-0 count2 value = 60
Thread name: Thread-0  count1 value = 62
Thread name: Thread-0 count2 value = 61
Thread name: Thread-0  count1 value = 63
Thread name: Thread-0 count2 value = 62
Thread name: Thread-0  count1 value = 64
Thread name: Thread-0 count2 value = 63
Thread name: Thread-0  count1 value = 65
Thread name: Thread-0 count2 value = 64
Thread name: Thread-0  count1 value = 66
Thread name: Thread-0 count2 value = 65
Thread name: Thread-0  count1 value = 67
Thread name: Thread-0 count2 value = 66
Thread name: Thread-0  count1 value = 68
Thread name: Thread-0 count2 value = 67
Thread name: Thread-0  count1 value = 69
Thread name: Thread-0 count2 value = 68
Thread name: Thread-0  count1 value = 70
Thread name: Thread-0 count2 value = 69
Thread name: Thread-0  count1 value = 71
Thread name: Thread-0 count2 value = 70
Thread name: Thread-0  count1 value = 72
Thread name: Thread-0 count2 value = 71
Thread name: Thread-0  count1 value = 73
Thread name: Thread-0 count2 value = 72
Thread name: Thread-0  count1 value = 74
Thread name: Thread-0 count2 value = 73
Thread name: Thread-0  count1 value = 75
Thread name: Thread-0 count2 value = 74
Thread name: Thread-0  count1 value = 76
Thread name: Thread-0 count2 value = 75
Thread name: Thread-0  count1 value = 77
Thread name: Thread-0 count2 value = 76
Thread name: Thread-0  count1 value = 78
Thread name: Thread-0 count2 value = 77
Thread name: Thread-0  count1 value = 79
Thread name: Thread-0 count2 value = 78
Thread name: Thread-0  count1 value = 80
Thread name: Thread-0 count2 value = 79
Thread name: Thread-0  count1 value = 81
Thread name: Thread-0 count2 value = 80
Thread name: Thread-0  count1 value = 82
Thread name: Thread-0 count2 value = 81
Thread name: Thread-0  count1 value = 83
Thread name: Thread-0 count2 value = 82
Thread name: Thread-0  count1 value = 84
Thread name: Thread-0 count2 value = 83
Thread name: Thread-0  count1 value = 85
Thread name: Thread-0 count2 value = 84
Thread name: Thread-0  count1 value = 86
Thread name: Thread-0 count2 value = 85
Thread name: Thread-0  count1 value = 87
Thread name: Thread-0 count2 value = 86
Thread name: Thread-0  count1 value = 88
Thread name: Thread-0 count2 value = 87
Thread name: Thread-0  count1 value = 89
Thread name: Thread-0 count2 value = 88
Thread name: Thread-0  count1 value = 90
Thread name: Thread-0 count2 value = 89
Thread name: Thread-0  count1 value = 91
Thread name: Thread-0 count2 value = 90
Thread name: Thread-0  count1 value = 92
Thread name: Thread-0 count2 value = 91
Thread name: Thread-0  count1 value = 93
Thread name: Thread-0 count2 value = 92
Thread name: Thread-0  count1 value = 94
Thread name: Thread-0 count2 value = 93
Thread name: Thread-0  count1 value = 95
Thread name: Thread-0 count2 value = 94
Thread name: Thread-0  count1 value = 96
Thread name: Thread-0 count2 value = 95
Thread name: Thread-0  count1 value = 97
Thread name: Thread-0 count2 value = 96
Thread name: Thread-0  count1 value = 98
Thread name: Thread-0 count2 value = 97
Thread name: Thread-0  count1 value = 99
Thread name: Thread-0 count2 value = 98
Thread name: Thread-0  count1 value = 100
Thread name: Thread-0 count2 value = 99
Thread name: Thread-0  count1 value = 101
Thread name: Thread-0 count2 value = 100
Thread name: Thread-0  count1 value = 102
Thread name: Thread-0 count2 value = 101
Thread name: Thread-0  count1 value = 103
Thread name: Thread-0 count2 value = 102
Thread name: Thread-0  count1 value = 104
Thread name: Thread-0 count2 value = 103
Thread name: Thread-0  count1 value = 105
Thread name: Thread-0 count2 value = 104
Thread name: Thread-0  count1 value = 106
Thread name: Thread-0 count2 value = 105
Thread name: Thread-0  count1 value = 107
Thread name: Thread-0 count2 value = 106
Thread name: Thread-0  count1 value = 108
Thread name: Thread-0 count2 value = 107
Thread name: Thread-0  count1 value = 109
Thread name: Thread-0 count2 value = 108
Thread name: Thread-0  count1 value = 110
Thread name: Thread-0 count2 value = 109
Thread name: Thread-0  count1 value = 111
Thread name: Thread-0 count2 value = 110
Thread name: Thread-0  count1 value = 112
Thread name: Thread-0 count2 value = 111
Thread name: Thread-0  count1 value = 113
Thread name: Thread-0 count2 value = 112
Thread name: Thread-0  count1 value = 114
Thread name: Thread-0 count2 value = 113
Thread name: Thread-0  count1 value = 115
Thread name: Thread-0 count2 value = 114
Thread name: Thread-0  count1 value = 116
Thread name: Thread-0 count2 value = 115
Thread name: Thread-0  count1 value = 117
Thread name: Thread-0 count2 value = 116
Thread name: Thread-0  count1 value = 118
Thread name: Thread-0 count2 value = 117
Thread name: Thread-0  count1 value = 119
Thread name: Thread-0 count2 value = 118
Thread name: Thread-1 count2 value = 119
Thread name: Thread-1  count1 value = 120
Thread name: Thread-1 count2 value = 120
Thread name: Thread-1  count1 value = 121
Thread name: Thread-1 count2 value = 121
Thread name: Thread-1  count1 value = 122
Thread name: Thread-1 count2 value = 122
Thread name: Thread-1  count1 value = 123
Thread name: Thread-1 count2 value = 123
Thread name: Thread-1  count1 value = 124
Thread name: Thread-1 count2 value = 124
Thread name: Thread-1  count1 value = 125
Thread name: Thread-1 count2 value = 125
Thread name: Thread-1  count1 value = 126
Thread name: Thread-1 count2 value = 126
Thread name: Thread-1  count1 value = 127
Thread name: Thread-1 count2 value = 127
Thread name: Thread-1  count1 value = 128
Thread name: Thread-1 count2 value = 128
Thread name: Thread-1  count1 value = 129
Thread name: Thread-1 count2 value = 129
Thread name: Thread-1  count1 value = 130
Thread name: Thread-1 count2 value = 130
Thread name: Thread-1  count1 value = 131
Thread name: Thread-1 count2 value = 131
Thread name: Thread-1  count1 value = 132
Thread name: Thread-1 count2 value = 132
Thread name: Thread-1  count1 value = 133
Thread name: Thread-1 count2 value = 133
Thread name: Thread-1  count1 value = 134
Thread name: Thread-1 count2 value = 134
Thread name: Thread-1  count1 value = 135
Thread name: Thread-1 count2 value = 135
Thread name: Thread-1  count1 value = 136
Thread name: Thread-1 count2 value = 136
Thread name: Thread-1  count1 value = 137
Thread name: Thread-1 count2 value = 137
Thread name: Thread-1  count1 value = 138
Thread name: Thread-1 count2 value = 138
Thread name: Thread-1  count1 value = 139
Thread name: Thread-1 count2 value = 139
Thread name: Thread-1  count1 value = 140
Thread name: Thread-1 count2 value = 140
Thread name: Thread-1  count1 value = 141
Thread name: Thread-1 count2 value = 141
Thread name: Thread-1  count1 value = 142
Thread name: Thread-1 count2 value = 142
Thread name: Thread-1  count1 value = 143
Thread name: Thread-1 count2 value = 143
Thread name: Thread-1  count1 value = 144
Thread name: Thread-1 count2 value = 144
Thread name: Thread-1  count1 value = 145
Thread name: Thread-1 count2 value = 145
Thread name: Thread-1  count1 value = 146
Thread name: Thread-1 count2 value = 146
Thread name: Thread-1  count1 value = 147
Thread name: Thread-1 count2 value = 147
Thread name: Thread-1  count1 value = 148
Thread name: Thread-1 count2 value = 148
Thread name: Thread-1  count1 value = 149
Thread name: Thread-1 count2 value = 149
Thread name: Thread-1  count1 value = 150
Thread name: Thread-1 count2 value = 150
Thread name: Thread-1  count1 value = 151
Thread name: Thread-1 count2 value = 151
Thread name: Thread-1  count1 value = 152
Thread name: Thread-1 count2 value = 152
Thread name: Thread-1  count1 value = 153
Thread name: Thread-1 count2 value = 153
Thread name: Thread-1  count1 value = 154
Thread name: Thread-1 count2 value = 154
Thread name: Thread-1  count1 value = 155
Thread name: Thread-1 count2 value = 155
Thread name: Thread-1  count1 value = 156
Thread name: Thread-1 count2 value = 156
Thread name: Thread-1  count1 value = 157
Thread name: Thread-1 count2 value = 157
Thread name: Thread-1  count1 value = 158
Thread name: Thread-1 count2 value = 158
Thread name: Thread-1  count1 value = 159
Thread name: Thread-1 count2 value = 159
Thread name: Thread-1  count1 value = 160
Thread name: Thread-1 count2 value = 160
Thread name: Thread-1  count1 value = 161
Thread name: Thread-1 count2 value = 161
Thread name: Thread-1  count1 value = 162
Thread name: Thread-1 count2 value = 162
Thread name: Thread-1  count1 value = 163
Thread name: Thread-1 count2 value = 163
Thread name: Thread-1  count1 value = 164
Thread name: Thread-1 count2 value = 164
Thread name: Thread-1  count1 value = 165
Thread name: Thread-1 count2 value = 165
Thread name: Thread-1  count1 value = 166
Thread name: Thread-1 count2 value = 166
Thread name: Thread-1  count1 value = 167
Thread name: Thread-1 count2 value = 167
Thread name: Thread-1  count1 value = 168
Thread name: Thread-1 count2 value = 168
Thread name: Thread-1  count1 value = 169
Thread name: Thread-1 count2 value = 169
Thread name: Thread-1  count1 value = 170
Thread name: Thread-1 count2 value = 170
Thread name: Thread-1  count1 value = 171
Thread name: Thread-1 count2 value = 171
Thread name: Thread-1  count1 value = 172
Thread name: Thread-1 count2 value = 172
Thread name: Thread-1  count1 value = 173
Thread name: Thread-1 count2 value = 173
Thread name: Thread-1  count1 value = 174
Thread name: Thread-1 count2 value = 174
Thread name: Thread-1  count1 value = 175
Thread name: Thread-1 count2 value = 175
Thread name: Thread-1  count1 value = 176
Thread name: Thread-1 count2 value = 176
Thread name: Thread-1  count1 value = 177
Thread name: Thread-1 count2 value = 177
Thread name: Thread-1  count1 value = 178
Thread name: Thread-1 count2 value = 178
Thread name: Thread-1  count1 value = 179
Thread name: Thread-1 count2 value = 179
Thread name: Thread-1  count1 value = 180
Thread name: Thread-1 count2 value = 180
Thread name: Thread-1  count1 value = 181
Thread name: Thread-1 count2 value = 181
Thread name: Thread-1  count1 value = 182
Thread name: Thread-1 count2 value = 182
Thread name: Thread-1  count1 value = 183
Thread name: Thread-1 count2 value = 183
Thread name: Thread-1  count1 value = 184
Thread name: Thread-1 count2 value = 184
Thread name: Thread-1  count1 value = 185
Thread name: Thread-1 count2 value = 185
Thread name: Thread-1  count1 value = 186
Thread name: Thread-1 count2 value = 186
Thread name: Thread-1  count1 value = 187
Thread name: Thread-1 count2 value = 187
Thread name: Thread-1  count1 value = 188
Thread name: Thread-1 count2 value = 188
Thread name: Thread-1  count1 value = 189
Thread name: Thread-1 count2 value = 189
Thread name: Thread-1  count1 value = 190
Thread name: Thread-1 count2 value = 190
Thread name: Thread-1  count1 value = 191
Thread name: Thread-1 count2 value = 191
Thread name: Thread-1  count1 value = 192
Thread name: Thread-1 count2 value = 192
Thread name: Thread-1  count1 value = 193
Thread name: Thread-1 count2 value = 193
Thread name: Thread-1  count1 value = 194
Thread name: Thread-1 count2 value = 194
Thread name: Thread-1  count1 value = 195
Thread name: Thread-1 count2 value = 195
Thread name: Thread-1  count1 value = 196
Thread name: Thread-1 count2 value = 196
Thread name: Thread-1  count1 value = 197
Thread name: Thread-1 count2 value = 197
Thread name: Thread-1  count1 value = 198
Thread name: Thread-1 count2 value = 198
Thread name: Thread-1  count1 value = 199
Thread name: Thread-1 count2 value = 199
Thread name: Thread-1  count1 value = 200
Thread name: Thread-1 count2 value = 200
Count1=200  Count2=200

因此,當線程確實獲得訪問權限時,它將擁有兩個synchronized方法。 當控制項從一個閾值切換到另一個閾值時,計數器值將被更新並被記住。

將會發生的事情是,兩個線程都調用compute()方法,進入for循環,並在第一次調用add()

兩者之一將在另一個之前存在,因此他將輸入synchronized方法。 當他處於方法中時,第二個線程可能到達add()調用。 這是一種可能,因為您無法說出哪個線程在什么時間點在哪里。 JVM決定哪些線程可以在什么時候執行操作是不確定的。 但是,讓我們假設第二個線程到達了add()調用,並且現在想執行該方法。 它無法synchronized ,因此當前無法synchronized並且另一個線程已經在調用它。 因此線程進入等待狀態。 第一個線程完成了對add()調用。 現在第二個線程可能會進入add() ,進行調用,退出add()並輸入addAgain() 現在,這使第一個線程處於等待狀態。

這聽起來可能令人困惑,而這正是我要達到的目的:

您不能說哪個線程何時調用什么方法。 JVM可能決定讓您的第一個線程先執行兩個方法的100次調用,然后第二個線程執行相同的操作。 它可能決定他們稱他們為交替。 現實可能介於兩者之間。 兩個線程中的一個甚至可能在另一個線程尚未完成初始化之前甚至沒有輸入compute()方法。 你不知道 這完全取決於您的系統,處理器的數量,發生的代碼和cpu優化,所使用的算法調度程序等等。

一旦執行了多線程,發生什么事情就不再為您所用。 通過調用join您可以等待任務完成。 但是沒有確定性的方法可以保證1ms,2ms或250ms的情況。


所以你的問題:

  1. 當線程調用計算方法時,它是否可以訪問內部的兩個同步方法並執行增量操作?

不,不是的。 通過調用add ,可以訪問此方法。 它不會自動獲得對第二種方法的訪問。

  1. 如果一個線程可以訪問for循環,它是完成for循環還是在競爭之前與其他線程共享?

你不能說。 既不能保證完成循環,也不能保證在完成之前被中斷。

  1. 如果是這種情況,我假設另一個線程處於等待階段,並且不會做太多事情。 這個對嗎?

如果一個線程在另一個線程已經訪問了synchronized方法的情況下嘗試訪問該方法,則它將處於等待狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM