函数所非常简单
只需要在函数定义的时候加上synchronized关键字就可以了
那么synchronized用的是什么锁呢
答:this锁,怎么知道他是this锁的呢
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的字节码文件锁
两个线程一个使用使用同步函数另一个使用静态同步函数是不能实现同步的