关于线程同步的几种方法

    java允许多线程,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),


 将会导致数据不准确,相互之间产生冲突。
 比方说,我们在买火车票的时候,如何能确定余票数据准确而无误差,这个时候就需要用到同步。
 

 1:使用同步方法:
  
  即用 synchronized关键字修饰方法。
  
public class Text {
    //线程同步的5种方式


    private int index = 10;

    public int getIndex(){
        return index;
    }

    /**
     * 用同步方法实现
     *
     * @param dex
     */

    public synchronized void saveValue(int dex){
        index+=dex;
    }


 2:使用同步代码块:
  有synchronized关键字修饰的语句块。
  
  
public class Text {
    //线程同步的5种方式


    private int index = 10;

    public int getIndex(){
        return index;
    }

    /**
     * 用同步方法实现
     *
     * @param dex
     */

//    public synchronized void saveValue(int dex){
//        index+=dex;
//    }

    /**
     * 用同步代码块实现
     *
     * @param dex
     */
    public void saveValue(int dex){
        synchronized (this){
            index+=dex;
        }
    }

 3:使用特殊域变量(volatile)实现线程同步
    a:volatile关键字为域变量的访问提供了一种免锁机制, 
    b:使用volatile修饰域相当于告诉 虚拟机该域可能会被其他线程更新, 
    c:因此每次使用该域就要重新计算,而不是使用寄存器中的值 
    d:volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
 
  其他代码不变,只需要在定义变量的时候用volatile
   private volatile int index = 10;

  注意,不需要再使用synchronized
public void saveValue(int dex){
    index+=dex;
}

 4:使用 ReentrantLock类:
 
public class Text {
    //线程同步的5种方式


    private int index = 10;
    private Lock lock = new ReentrantLock();

    public int getIndex(){
        return index;
    }



    public void saveValue(int dex){
        lock.lock();
        try{
            index+=dex;
        }finally{
            lock.unlock();
        }
       
    }

  使用ReentrantLock类,注意要及时释放锁


 5:使用局部变量实现线程同步 
    如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 
    副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

   ThreadLocal() : 创建一个线程本地变量 
    get() : 返回此线程局部变量的当前线程副本中的值 
    initialValue() : 返回此线程局部变量的当前线程的"初始值" 
    set(T value) : 将此线程局部变量的当前线程副本中的值设置为value


  
    private static ThreadLocal<Integer> index = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 10;
        }
    };

    public  int getAccount(){
        return  index.get();
    };

    public void save (int money){
        index.set(index.get()+money);
    }

 下面,我们来测试下用锁和不用锁的区别:
  首先编写测试代码,
  
public class Go {

    public static void main(String[] args) {
         Go go = new Go();
         go.TestThread();
    }


    public void TestThread(){
        Text text = new Text();
        NewThread th = new NewThread(text);
        System.out.println("线程1");
        Thread thread1 = new Thread(th);
        thread1.start();
        System.out.println("线程2");
        Thread thread2 = new Thread(th);
        thread2.start();

    }


    class NewThread implements Runnable{

        private Text text;

        public NewThread(Text text){
            this.text = text;
        }

        @Override
        public void run() {
            for (int i = 0; i < 200; i++) {
                text.saveValue(1);
                System.out.println(i + "账户余额为:" + text.getIndex());
            }
        }
    }
}

在不用锁的情况下:我们看输出值
 
0账户余额为:12
0账户余额为:12
1账户余额为:13
1账户余额为:14
2账户余额为:15
2账户余额为:16
3账户余额为:17
3账户余额为:18
4账户余额为:19
4账户余额为:20
5账户余额为:21
5账户余额为:22
6账户余额为:23
6账户余额为:24
7账户余额为:25
7账户余额为:26
8账户余额为:27
9账户余额为:29
8账户余额为:28
10账户余额为:30
9账户余额为:31
11账户余额为:32
10账户余额为:33
12账户余额为:34
11账户余额为:35
13账户余额为:36
12账户余额为:37
14账户余额为:38
13账户余额为:39
14账户余额为:41
15账户余额为:42
16账户余额为:43
17账户余额为:44
18账户余额为:45
15账户余额为:40
19账户余额为:46
16账户余额为:47
20账户余额为:48
17账户余额为:49
21账户余额为:50
22账户余额为:52
23账户余额为:53
24账户余额为:54
18账户余额为:51
25账户余额为:55
19账户余额为:56
26账户余额为:57
20账户余额为:58
27账户余额为:59
21账户余额为:60
28账户余额为:61
22账户余额为:62
23账户余额为:64
24账户余额为:65
29账户余额为:63
25账户余额为:66
30账户余额为:67
26账户余额为:68
31账户余额为:69
27账户余额为:70
32账户余额为:71
33账户余额为:73
28账户余额为:72
34账户余额为:74
29账户余额为:75
35账户余额为:76
30账户余额为:77
36账户余额为:78
31账户余额为:79
37账户余额为:80
32账户余额为:81
38账户余额为:82
33账户余额为:83
39账户余额为:84
40账户余额为:86
34账户余额为:85
41账户余额为:87
42账户余额为:89
35账户余额为:88
36账户余额为:91
37账户余额为:92
43账户余额为:90
38账户余额为:93
44账户余额为:94
39账户余额为:95
45账户余额为:96
46账户余额为:98
47账户余额为:99
48账户余额为:100
49账户余额为:101
50账户余额为:102
51账户余额为:103
40账户余额为:97
52账户余额为:104
41账户余额为:105
53账户余额为:106
42账户余额为:107
54账户余额为:108
43账户余额为:109
55账户余额为:110
44账户余额为:111
56账户余额为:112
45账户余额为:113
57账户余额为:114
46账户余额为:115
58账户余额为:116
47账户余额为:117
59账户余额为:118
48账户余额为:119
60账户余额为:120
49账户余额为:121
61账户余额为:122
62账户余额为:124
50账户余额为:123
63账户余额为:125
51账户余额为:126
64账户余额为:127
52账户余额为:128
65账户余额为:129
53账户余额为:130
66账户余额为:131
67账户余额为:133
54账户余额为:132
68账户余额为:134
69账户余额为:136
70账户余额为:137
71账户余额为:138
72账户余额为:139
73账户余额为:140
74账户余额为:141
75账户余额为:142
76账户余额为:143
77账户余额为:144
78账户余额为:145
79账户余额为:146
80账户余额为:147
81账户余额为:148
82账户余额为:149
83账户余额为:150
84账户余额为:151
85账户余额为:152
86账户余额为:153
87账户余额为:154
88账户余额为:155
89账户余额为:156
90账户余额为:157
91账户余额为:158
92账户余额为:159
55账户余额为:135
93账户余额为:160
56账户余额为:161
94账户余额为:162
57账户余额为:163
58账户余额为:165
59账户余额为:166
60账户余额为:167
61账户余额为:168
62账户余额为:169
63账户余额为:170
64账户余额为:171
95账户余额为:164
65账户余额为:172
96账户余额为:173
66账户余额为:174
97账户余额为:175
67账户余额为:176
98账户余额为:177
68账户余额为:178
99账户余额为:179
69账户余额为:180
100账户余额为:181
70账户余额为:182
101账户余额为:183
71账户余额为:184
102账户余额为:185
72账户余额为:186
103账户余额为:187
73账户余额为:188
104账户余额为:189
74账户余额为:190
105账户余额为:191
75账户余额为:192
106账户余额为:193
76账户余额为:194
107账户余额为:195
77账户余额为:196
108账户余额为:197
78账户余额为:198
109账户余额为:199
79账户余额为:200
110账户余额为:201
80账户余额为:202
111账户余额为:203
81账户余额为:204
112账户余额为:205
82账户余额为:206
113账户余额为:207
83账户余额为:208
114账户余额为:209
84账户余额为:210
115账户余额为:211
85账户余额为:212
116账户余额为:213
86账户余额为:214
117账户余额为:215
87账户余额为:216
118账户余额为:217
88账户余额为:218
119账户余额为:219
89账户余额为:220
120账户余额为:221
90账户余额为:222
121账户余额为:223
91账户余额为:224
122账户余额为:225
92账户余额为:226
123账户余额为:227
93账户余额为:228
124账户余额为:229
94账户余额为:230
125账户余额为:231
95账户余额为:232
126账户余额为:233
96账户余额为:234
127账户余额为:235
97账户余额为:236
128账户余额为:237
98账户余额为:238
129账户余额为:239
99账户余额为:240
130账户余额为:241
100账户余额为:242
131账户余额为:243
101账户余额为:244
132账户余额为:245
102账户余额为:246
133账户余额为:247
103账户余额为:248
134账户余额为:249
104账户余额为:250
135账户余额为:251
105账户余额为:252
136账户余额为:253
106账户余额为:254
137账户余额为:255
107账户余额为:256
138账户余额为:257
108账户余额为:258
139账户余额为:259
109账户余额为:260
140账户余额为:261
110账户余额为:262
141账户余额为:263
111账户余额为:264
142账户余额为:265
112账户余额为:266
143账户余额为:267
113账户余额为:268
144账户余额为:269
145账户余额为:271
114账户余额为:270
146账户余额为:272
115账户余额为:273
147账户余额为:274
116账户余额为:275
148账户余额为:276
117账户余额为:277
149账户余额为:278
118账户余额为:279
150账户余额为:280
151账户余额为:282
152账户余额为:283
153账户余额为:284
154账户余额为:285
155账户余额为:286
156账户余额为:287
157账户余额为:288
158账户余额为:289
159账户余额为:290
160账户余额为:291
119账户余额为:281
161账户余额为:292
162账户余额为:294
163账户余额为:295
164账户余额为:296
120账户余额为:293
165账户余额为:297
121账户余额为:298
166账户余额为:299
122账户余额为:300
167账户余额为:301
123账户余额为:302
168账户余额为:303
169账户余额为:305
170账户余额为:306
171账户余额为:307
172账户余额为:308
173账户余额为:309
124账户余额为:304
174账户余额为:310
125账户余额为:311
175账户余额为:312
126账户余额为:313
176账户余额为:314
127账户余额为:315
177账户余额为:316
178账户余额为:318
179账户余额为:319
180账户余额为:320
181账户余额为:321
182账户余额为:322
183账户余额为:323
184账户余额为:324
185账户余额为:325
128账户余额为:317
186账户余额为:326
187账户余额为:328
129账户余额为:327
188账户余额为:329
130账户余额为:330
189账户余额为:331
131账户余额为:332
190账户余额为:333
191账户余额为:335
192账户余额为:336
193账户余额为:337
194账户余额为:338
195账户余额为:339
196账户余额为:340
197账户余额为:341
132账户余额为:334
198账户余额为:342
133账户余额为:343
199账户余额为:344
134账户余额为:345
135账户余额为:346
136账户余额为:347
137账户余额为:348
138账户余额为:349
139账户余额为:350
140账户余额为:351
141账户余额为:352
142账户余额为:353
143账户余额为:354
144账户余额为:355
145账户余额为:356
146账户余额为:357
147账户余额为:358
148账户余额为:359
149账户余额为:360
150账户余额为:361
151账户余额为:362
152账户余额为:363
153账户余额为:364
154账户余额为:365
155账户余额为:366
156账户余额为:367
157账户余额为:368
158账户余额为:369
159账户余额为:370
160账户余额为:371
161账户余额为:372
162账户余额为:373
163账户余额为:374
164账户余额为:375
165账户余额为:376
166账户余额为:377
167账户余额为:378
168账户余额为:379
169账户余额为:380
170账户余额为:381
171账户余额为:382
172账户余额为:383
173账户余额为:384
174账户余额为:385
175账户余额为:386
176账户余额为:387
177账户余额为:388
178账户余额为:389
179账户余额为:390
180账户余额为:391
181账户余额为:392
182账户余额为:393
183账户余额为:394
184账户余额为:395
185账户余额为:396
186账户余额为:397
187账户余额为:398
188账户余额为:399
189账户余额为:400
190账户余额为:401
191账户余额为:402
192账户余额为:403
193账户余额为:404
194账户余额为:405
195账户余额为:406
196账户余额为:407
197账户余额为:408
198账户余额为:409
199账户余额为:410
 在用锁的情况下:我们看输出值
 
0账户余额为:11
1账户余额为:12
2账户余额为:13
3账户余额为:14
4账户余额为:15
5账户余额为:16
6账户余额为:17
7账户余额为:18
8账户余额为:19
9账户余额为:20
10账户余额为:21
11账户余额为:22
12账户余额为:23
13账户余额为:24
14账户余额为:25
15账户余额为:26
16账户余额为:27
17账户余额为:28
18账户余额为:29
19账户余额为:30
20账户余额为:31
21账户余额为:32
22账户余额为:33
23账户余额为:34
24账户余额为:35
25账户余额为:36
26账户余额为:37
27账户余额为:38
28账户余额为:39
29账户余额为:40
30账户余额为:41
31账户余额为:42
32账户余额为:43
33账户余额为:44
34账户余额为:45
35账户余额为:46
36账户余额为:47
37账户余额为:48
38账户余额为:49
39账户余额为:50
40账户余额为:51
41账户余额为:52
42账户余额为:53
43账户余额为:54
44账户余额为:55
45账户余额为:56
46账户余额为:57
47账户余额为:58
48账户余额为:59
49账户余额为:60
50账户余额为:61
51账户余额为:62
52账户余额为:63
53账户余额为:64
54账户余额为:65
55账户余额为:66
56账户余额为:67
57账户余额为:68
58账户余额为:69
59账户余额为:70
60账户余额为:71
61账户余额为:72
62账户余额为:73
63账户余额为:74
64账户余额为:75
65账户余额为:76
66账户余额为:77
67账户余额为:78
68账户余额为:79
69账户余额为:80
70账户余额为:81
71账户余额为:82
72账户余额为:83
73账户余额为:84
74账户余额为:85
75账户余额为:86
76账户余额为:87
77账户余额为:88
78账户余额为:89
79账户余额为:90
80账户余额为:91
81账户余额为:92
82账户余额为:93
83账户余额为:94
84账户余额为:95
85账户余额为:96
86账户余额为:97
87账户余额为:98
88账户余额为:99
89账户余额为:100
90账户余额为:101
91账户余额为:102
92账户余额为:103
93账户余额为:104
94账户余额为:105
95账户余额为:106
96账户余额为:107
97账户余额为:108
98账户余额为:109
99账户余额为:110
100账户余额为:111
101账户余额为:112
102账户余额为:113
103账户余额为:114
104账户余额为:115
105账户余额为:116
106账户余额为:117
107账户余额为:118
108账户余额为:119
109账户余额为:120
110账户余额为:121
111账户余额为:122
112账户余额为:123
113账户余额为:124
114账户余额为:125
115账户余额为:126
116账户余额为:127
117账户余额为:128
118账户余额为:129
119账户余额为:130
120账户余额为:131
121账户余额为:132
122账户余额为:133
123账户余额为:134
124账户余额为:135
125账户余额为:136
126账户余额为:137
127账户余额为:138
128账户余额为:139
129账户余额为:140
130账户余额为:141
131账户余额为:142
132账户余额为:143
0账户余额为:144
1账户余额为:146
133账户余额为:146
2账户余额为:147
134账户余额为:148
3账户余额为:149
135账户余额为:150
4账户余额为:151
136账户余额为:152
5账户余额为:153
137账户余额为:154
6账户余额为:155
138账户余额为:156
7账户余额为:157
139账户余额为:158
8账户余额为:159
140账户余额为:160
9账户余额为:161
141账户余额为:162
10账户余额为:163
142账户余额为:164
11账户余额为:165
143账户余额为:166
12账户余额为:167
144账户余额为:168
13账户余额为:169
145账户余额为:170
14账户余额为:171
146账户余额为:172
147账户余额为:174
148账户余额为:175
149账户余额为:176
150账户余额为:177
151账户余额为:178
152账户余额为:179
153账户余额为:180
154账户余额为:181
155账户余额为:182
156账户余额为:183
157账户余额为:184
158账户余额为:185
159账户余额为:186
160账户余额为:187
161账户余额为:188
162账户余额为:189
163账户余额为:190
164账户余额为:191
165账户余额为:192
166账户余额为:193
167账户余额为:194
168账户余额为:195
169账户余额为:196
170账户余额为:197
171账户余额为:198
172账户余额为:199
173账户余额为:200
174账户余额为:201
175账户余额为:202
176账户余额为:203
177账户余额为:204
178账户余额为:205
179账户余额为:206
180账户余额为:207
181账户余额为:208
182账户余额为:209
183账户余额为:210
184账户余额为:211
185账户余额为:212
186账户余额为:213
187账户余额为:214
188账户余额为:215
189账户余额为:216
190账户余额为:217
191账户余额为:218
192账户余额为:219
193账户余额为:220
194账户余额为:221
195账户余额为:222
196账户余额为:223
197账户余额为:224
198账户余额为:225
199账户余额为:226
15账户余额为:173
16账户余额为:227
17账户余额为:228
18账户余额为:229
19账户余额为:230
20账户余额为:231
21账户余额为:232
22账户余额为:233
23账户余额为:234
24账户余额为:235
25账户余额为:236
26账户余额为:237
27账户余额为:238
28账户余额为:239
29账户余额为:240
30账户余额为:241
31账户余额为:242
32账户余额为:243
33账户余额为:244
34账户余额为:245
35账户余额为:246
36账户余额为:247
37账户余额为:248
38账户余额为:249
39账户余额为:250
40账户余额为:251
41账户余额为:252
42账户余额为:253
43账户余额为:254
44账户余额为:255
45账户余额为:256
46账户余额为:257
47账户余额为:258
48账户余额为:259
49账户余额为:260
50账户余额为:261
51账户余额为:262
52账户余额为:263
53账户余额为:264
54账户余额为:265
55账户余额为:266
56账户余额为:267
57账户余额为:268
58账户余额为:269
59账户余额为:270
60账户余额为:271
61账户余额为:272
62账户余额为:273
63账户余额为:274
64账户余额为:275
65账户余额为:276
66账户余额为:277
67账户余额为:278
68账户余额为:279
69账户余额为:280
70账户余额为:281
71账户余额为:282
72账户余额为:283
73账户余额为:284
74账户余额为:285
75账户余额为:286
76账户余额为:287
77账户余额为:288
78账户余额为:289
79账户余额为:290
80账户余额为:291
81账户余额为:292
82账户余额为:293
83账户余额为:294
84账户余额为:295
85账户余额为:296
86账户余额为:297
87账户余额为:298
88账户余额为:299
89账户余额为:300
90账户余额为:301
91账户余额为:302
92账户余额为:303
93账户余额为:304
94账户余额为:305
95账户余额为:306
96账户余额为:307
97账户余额为:308
98账户余额为:309
99账户余额为:310
100账户余额为:311
101账户余额为:312
102账户余额为:313
103账户余额为:314
104账户余额为:315
105账户余额为:316
106账户余额为:317
107账户余额为:318
108账户余额为:319
109账户余额为:320
110账户余额为:321
111账户余额为:322
112账户余额为:323
113账户余额为:324
114账户余额为:325
115账户余额为:326
116账户余额为:327
117账户余额为:328
118账户余额为:329
119账户余额为:330
120账户余额为:331
121账户余额为:332
122账户余额为:333
123账户余额为:334
124账户余额为:335
125账户余额为:336
126账户余额为:337
127账户余额为:338
128账户余额为:339
129账户余额为:340
130账户余额为:341
131账户余额为:342
132账户余额为:343
133账户余额为:344
134账户余额为:345
135账户余额为:346
136账户余额为:347
137账户余额为:348
138账户余额为:349
139账户余额为:350
140账户余额为:351
141账户余额为:352
142账户余额为:353
143账户余额为:354
144账户余额为:355
145账户余额为:356
146账户余额为:357
147账户余额为:358
148账户余额为:359
149账户余额为:360
150账户余额为:361
151账户余额为:362
152账户余额为:363
153账户余额为:364
154账户余额为:365
155账户余额为:366
156账户余额为:367
157账户余额为:368
158账户余额为:369
159账户余额为:370
160账户余额为:371
161账户余额为:372
162账户余额为:373
163账户余额为:374
164账户余额为:375
165账户余额为:376
166账户余额为:377
167账户余额为:378
168账户余额为:379
169账户余额为:380
170账户余额为:381
171账户余额为:382
172账户余额为:383
173账户余额为:384
174账户余额为:385
175账户余额为:386
176账户余额为:387
177账户余额为:388
178账户余额为:389
179账户余额为:390
180账户余额为:391
181账户余额为:392
182账户余额为:393
183账户余额为:394
184账户余额为:395
185账户余额为:396
186账户余额为:397
187账户余额为:398
188账户余额为:399
189账户余额为:400
190账户余额为:401
191账户余额为:402
192账户余额为:403
193账户余额为:404
194账户余额为:405
195账户余额为:406
196账户余额为:407
197账户余额为:408
198账户余额为:409
199账户余额为:410

 结果很明显了,这就是同步的作用。
 


  
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值