qq46843大騙子qq,我給他做了一個網站,然後他不掏錢,大騙子真實記錄!
qq46843大騙子qq他叫花總,大騙子!我給他做了一個網站,然後他不掏錢,大騙子真實記錄!qq46843大騙子qq,我給他做了一個網站,然後他不掏錢,大騙子真實記錄!有聊天截圖,真的不要相信,空間都是一些吹牛逼的信息!真是一個大騙子,大騙子qq他是做菠菜的代理的,主要做的萬達,說還有一個代理他麽的全是騙子!不信的可以加我qq 45475106 我給你們爆料聊天截圖!媽的真是奇葩。第一次被菠菜代理騙!大家一定要記清楚!
每個對象在出生的時候就有一把鑰匙(監視器),那麽被synchronized 修飾的方法相當於給方法加了一個鎖,這個方法就可以進行同步,在多線程的時候,不會出現線程安全問題。
下面通過一張圖片進行講解:
1.一張圖片
圖片看不清,請點擊這裏 : 高清大圖
這裏寫圖片描述
2.圖片對應的代碼
import java.util.Date;
/**
* 測試的object類
*
* @author:dufy
* @version:1.0.0
* @date 2017/9/29
* @email [email protected]
*/
public class ObjectTest {
public synchronized void methodA(){
try {
System.out.println("This is methodA ...." + Thread.currentThread().getName() + ": " + new Date());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void methodB(){
System.out.println("This is methodB ...." + Thread.currentThread().getName() + ": " + new Date());
}
public synchronized void methodC(){
try {
System.out.println("This is methodC ...." + Thread.currentThread().getName() + ": " + new Date());
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
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
package com.dufy.concurrentcode;
/**
* 測試線程類
*
* @author:dufy
* @version:1.0.0
* @date 2017/9/29
* @email [email protected]
*/
public class ThreadTest extends Thread{
public static void main(String[] args) {
ObjectTest ot = new ObjectTest();
Thread1 t1 = new Thread1(ot,"thread1");
Thread2 t2 = new Thread2(ot,"thread2");
Thread3 t3 = new Thread3(ot,"thread3");
Thread4 t4 = new Thread4(ot,"thread4");
t1.start();
t2.start();
t3.start();
t4.start();
}
static class Thread1 extends Thread{
private ObjectTest objectTest;
public Thread1(ObjectTest objectTest,String name){
setName(name);
this.objectTest = objectTest;
}
@Override
public void run() {
super.run();
objectTest.methodA();
}
}
static class Thread2 extends Thread{
private ObjectTest objectTest;
public Thread2(ObjectTest objectTest,String name){
setName(name);
this.objectTest = objectTest;
}
@Override
public void run() {
super.run();
objectTest.methodB();
}
}
static class Thread3 extends Thread{
private ObjectTest objectTest;
public Thread3(ObjectTest objectTest,String name){
setName(name);
this.objectTest = objectTest;
}
@Override
public void run() {
super.run();
objectTest.methodA();
}
}
static class Thread4 extends Thread{
private ObjectTest objectTest;
public Thread4(ObjectTest objectTest,String name){
setName(name);
this.objectTest = objectTest;
}
@Override
public void run() {
super.run();
objectTest.methodC();
}
}
}
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
運行結果:
This is methodB ....thread2: Fri Sep 29 23:21:17 CST 2017
This is methodA ....thread1: Fri Sep 29 23:21:17 CST 2017
This is methodC ....thread4: Fri Sep 29 23:21:18 CST 2017
This is methodA ....thread3: Fri Sep 29 23:21:21 CST 2017
1
2
3
4
註:
1、運行的結果可能和上圖講的線程流程不同,沒有關系,只要理解對象鎖和synchronized的核心思想就好,線程的運行本來就是具有隨機性這個特點。
2、此段代碼是同步方法,其實同步的代碼塊也是一個道理,同步代碼塊用synchronized(this)時候,當一個線程訪問object的一個synchronized(this)同步代碼塊的時候,其他線程對object中所有其他的synchronized(this)同步的代碼塊訪問都被阻塞 (阻塞的是同步代碼塊,線程依然可以進入同步代碼塊的方法)。
3.總結
每個對象都有一把鎖(對象監視器),關鍵字synchronized取得鎖都是對象鎖,而不是把一段代碼或方法(函數)當做鎖。
上圖所示,哪個線程先執行帶有synchronized關鍵字的方法,哪個線程就持有這個方法所屬對象的鑰匙。其他線程只能處於等待狀態。
調用關鍵字synchronized聲明的方法,一定是排隊運行的。這才是使用synchronized關鍵字的作用,排隊運行,如果有共享資源的話,那麽共享資源的讀取就是線程安全的。
如果一個線程持有 object的鑰匙,那麽其他線程可以訪問object對象沒有上鎖的方法,也就是非synchronized類型的方法。
4.參考
Java多線程編程核心技術
如果帥氣(美麗)、睿智(聰穎),和我一樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!
祝你今天開心愉快!
歡迎訪問我的csdn博客,我們一同成長!
“不管做什麽,只要堅持下去就會看到不一樣!在路上,不卑不亢!
qq46843大騙子qq,我給他做了一個網站,然後他不掏錢,大騙子真實記錄!