函数所非常简单
只需要在函数定义的时候加上synchronized关键字就可以了
那么synchronized用的是什么锁呢
答:this锁,怎么知道他是this锁的呢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
public class ThreadTest implements Runnable {

private int trainCount = 100;
// private Object lock = new Object();
public boolean flag;

@Override
public void run() {
while (trainCount > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}

if (flag) {
sell1();
} else {
sell2();
}

}

}

public void sell1() {
synchronized (this) {
if (trainCount > 0) {
System.out.println(Thread.currentThread().getName() + " Sell a ticket:" + (100 - trainCount + 1));
trainCount--;
}
}
}


public synchronized void sell2() {
if (trainCount > 0) {
System.out.println(Thread.currentThread().getName() + " Sell a ticket:" + (100 - trainCount + 1));
trainCount--;
}
}


public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
Thread thread = new Thread(threadTest, "窗口①");
Thread thread2 = new Thread(threadTest, "窗口②");
thread.start();
threadTest.flag = true;
thread2.start();

}
}

//运行结果
// 窗口② Sell a ticket:1
// 窗口① Sell a ticket:2
// 窗口① Sell a ticket:3
// 窗口② Sell a ticket:4
// 窗口② Sell a ticket:5
// 窗口① Sell a ticket:6
// 窗口① Sell a ticket:7
// 窗口② Sell a ticket:8
// 窗口① Sell a ticket:9
// 窗口② Sell a ticket:10
// 窗口① Sell a ticket:11
// 窗口② Sell a ticket:12
// 窗口① Sell a ticket:13
// 窗口② Sell a ticket:14
// 窗口② Sell a ticket:15
// 窗口① Sell a ticket:16
// 窗口② Sell a ticket:17
// 窗口① Sell a ticket:18
// 窗口② Sell a ticket:19
// 窗口① Sell a ticket:20
// 窗口① Sell a ticket:21
// 窗口② Sell a ticket:22
// 窗口① Sell a ticket:23
// 窗口② Sell a ticket:24
// 窗口① Sell a ticket:25
// 窗口② Sell a ticket:26
// 窗口① Sell a ticket:27
// 窗口② Sell a ticket:28
// 窗口② Sell a ticket:29
// 窗口① Sell a ticket:30
// 窗口① Sell a ticket:31
// 窗口② Sell a ticket:32
// 窗口② Sell a ticket:33
// 窗口① Sell a ticket:34
// 窗口② Sell a ticket:35
// 窗口① Sell a ticket:36
// 窗口① Sell a ticket:37
// 窗口② Sell a ticket:38
// 窗口① Sell a ticket:39
// 窗口② Sell a ticket:40
// 窗口② Sell a ticket:41
// 窗口① Sell a ticket:42
// 窗口① Sell a ticket:43
// 窗口② Sell a ticket:44
// 窗口① Sell a ticket:45
// 窗口② Sell a ticket:46
// 窗口② Sell a ticket:47
// 窗口① Sell a ticket:48
// 窗口① Sell a ticket:49
// 窗口② Sell a ticket:50
// 窗口② Sell a ticket:51
// 窗口① Sell a ticket:52
// 窗口① Sell a ticket:53
// 窗口② Sell a ticket:54
// 窗口① Sell a ticket:55
// 窗口② Sell a ticket:56
// 窗口② Sell a ticket:57
// 窗口① Sell a ticket:58
// 窗口① Sell a ticket:59
// 窗口② Sell a ticket:60
// 窗口② Sell a ticket:61
// 窗口① Sell a ticket:62
// 窗口① Sell a ticket:63
// 窗口② Sell a ticket:64
// 窗口① Sell a ticket:65
// 窗口② Sell a ticket:66
// 窗口② Sell a ticket:67
// 窗口① Sell a ticket:68
// 窗口① Sell a ticket:69
// 窗口② Sell a ticket:70
// 窗口② Sell a ticket:71
// 窗口① Sell a ticket:72
// 窗口① Sell a ticket:73
// 窗口② Sell a ticket:74
// 窗口② Sell a ticket:75
// 窗口① Sell a ticket:76
// 窗口② Sell a ticket:77
// 窗口① Sell a ticket:78
// 窗口① Sell a ticket:79
// 窗口② Sell a ticket:80
// 窗口① Sell a ticket:81
// 窗口② Sell a ticket:82
// 窗口② Sell a ticket:83
// 窗口① Sell a ticket:84
// 窗口② Sell a ticket:85
// 窗口① Sell a ticket:86
// 窗口② Sell a ticket:87
// 窗口① Sell a ticket:88
// 窗口② Sell a ticket:89
// 窗口① Sell a ticket:90
// 窗口① Sell a ticket:91
// 窗口② Sell a ticket:92
// 窗口② Sell a ticket:93
// 窗口① Sell a ticket:94
// 窗口① Sell a ticket:95
// 窗口② Sell a ticket:96
// 窗口② Sell a ticket:97
// 窗口① Sell a ticket:98
// 窗口② Sell a ticket:99
// 窗口① Sell a ticket:100
//
// Process finished with exit code 0

sell1用的是this锁
sell2用的是函数锁

当我们把sell1函数中的同步代码块的this锁换成lock锁就会发现数据不同步
那为什么上面代码能证明函数锁就是this锁呢
前面我们说过需要同一把锁才可以进行线程发生同步上面运行结果很明显可以清楚的看到线程发生了同步足以说明函数锁就是this锁总结:
1.如果一个线程函数锁另一个线程使用this锁那么是可以同步的
2.如果一个线程函数锁另一个线程使用同步代码块(非this)锁就无法进行同步

静态同步函数锁使用的并不是this锁而是当前class的字节码文件锁 两个线程一个使用使用同步函数另一个使用静态同步函数是不能实现同步的