java线程同步块的疑问

package com.apex.etm.dbsync.util;

/**

public void test(String userId){
    synchronized(userId) {
        try {
            System.out.println(Thread.currentThread().getName() + "得到了锁,正在操作COUNT……" + userId);
            count = count + 1;
            System.out.println(count);
            System.out.println("操作COUNT完毕!");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    String a = "a";
    String b = "b";
    for (int i = 0; i < 100; i++) {
        new Thread(){
            @Override
            public void run() {
                try {
                    new LockUtils().test(a);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }.start();
    }

    for (int i = 0; i < 100; i++) {
        new Thread(){
            @Override
            public void run() {
                try {
                   new LockUtils().test(b);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

}

运行主函数输出如下

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

问题:同步块锁住的是不同的对象,但是线程还是同步,原因是什么呢,可以帮忙解惑下不

你做了几次实验?每次都是刚好200?
=============update===================
应该是修改count的速度太快,以至于根本没有出现多个线程同时获取到count的值,然后基于相同的值去修改count;也就说这些线程没有竞争,其实更像是排队修改。导致看起来使用2把锁得到的结果也一样;

那问题的关键就是count修改的太快,那就想到使用sleep;先获取count的值,然后sleep休眠线程,最后修改count的值;


public class ReentrantLockTest {

    static  int count=0;
    public void lock(String lock)  {
        synchronized (lock){
            int t = count;//获取值
            try {
                  Thread.sleep(1);//设置一个值表示:获取值到修改值消耗的时间。
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            count=t+1;//修改值
        }
    }

    @Test
    public void test() throws InterruptedException {
       final String a = "a";
       final String b = "b";
        CountDownLatch latch = new CountDownLatch(100);
        for (int i = 0; i < 100; i++) {
            if(i%2==0)
                new Thread(()->{
                    lock(a);//使用a作为锁
                    latch.countDown();
                }).start();
            else
                new Thread(()->{
                    lock(a);//使用b作为锁
                    latch.countDown();
                }).start();
        }
        latch.await();

        //使用2把锁:a,b得到的结果是50
        //使用同一把锁结果是:100
        System.out.println(count);


    }
}

最后的结果是符合预期的,使用2把锁count经过100个线程的增加结果是50;使用一把锁结果是100;