---------------------------------------------------------------------------------------------------------------------------------------------
synchronized关键字的几种用法和实例:
加在实例方法(类的某个方法上),作用于当前【实例】加锁,进入同步代码前要获得【当前实例】的锁
加在静态方法(某个类的静态方法上),作用于当前【类对象】加锁,进入同步代码前要获得【当前类对象】的锁
加在代码块(某个方法的一块代码上),【指定加锁对象】,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
1. 加在实例方法(类的某个方法上),作用于当前【实例】加锁,进入同步代码前要获得【当前实例】的锁
不同的对象是锁不住的。
效果如:com.test.synchronize.three
com.test.synchronize.two
com.test.synchronize.one
package com.test.synchronize.two;
public class CountTest{
static int i=0;
/**
* 方法上面加了锁定,结果任然计算不对
* @return
*/
public synchronized int add(){
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
return i;
}
}
package com.test.synchronize.two;
public class ThreedOne implements Runnable{
@Override
public void run() {
for(int j=0;j<10;j++){
System.out.println("ThreedOne+++++:"+new CountTest().add());
}
}
}
package com.test.synchronize.two;
public class Test {
public static void main(String[] args) {
ThreedOne t1= new ThreedOne();
ThreedOne t12= new ThreedOne();
new Thread(t1).start();
new Thread(t12).start();
}
}
/**
* 方法上面加了锁定,结果任然计算不对,原因在于new CountTest().add()
* 加在实例方法(类的某个方法上),作用于当前【实例】加锁,进入同步代码前要获得【当前实例】的锁
* 而这里的两个相同的线程每次都是new的实例,不是同一个实例。
ThreedOne+++++:1
ThreedOne+++++:2
ThreedOne+++++:3
ThreedOne+++++:3
ThreedOne+++++:5
ThreedOne+++++:4
ThreedOne+++++:6
ThreedOne+++++:6
ThreedOne+++++:8
ThreedOne+++++:7
ThreedOne+++++:9
ThreedOne+++++:10
ThreedOne+++++:11
ThreedOne+++++:11
ThreedOne+++++:12
ThreedOne+++++:12
ThreedOne+++++:13
ThreedOne+++++:14
ThreedOne+++++:15
ThreedOne+++++:16
**/
其他代码请下载代码包:
2. 加在代码块(某个方法的一块代码上),【指定加锁对象】,对给定对象加锁,进入同步代码库前要获得给定对象的锁
如果是:
synchronized (this)与锁定方法是一样的,这个this实际上也是当前类的一个实例,
所以不同的实例对象也是锁不住的
效果如:com.test.synchronize.four
package com.test.synchronize.four;
public class CountTest{
static int i=0;
/**
* 代码块的锁定synchronized (this)与锁定方法是一样的。计算结果还要靠使用这个方法的对象是不是同一个
* @return
*/
public int add(){
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (this) {
i++;
}
return i;
}
}
package com.test.synchronize.four;
public class ThreedOne implements Runnable{
private CountTest countTest;
public CountTest getCountTest() {
return countTest;
}
public void setCountTest(CountTest countTest) {
this.countTest = countTest;
}
public ThreedOne(CountTest countTest){
this.countTest = countTest;
}
@Override
public void run() {
for(int j=0;j<10;j++){
System.out.println("ThreedOne+++++:"+this.countTest.add());
}
}
}
package com.test.synchronize.four;
public class Test {
public static void main(String[] args) {
CountTest temp = new CountTest();
CountTest temp2 = new CountTest();
ThreedOne t1= new ThreedOne(temp);
ThreedOne t12= new ThreedOne(temp2);
new Thread(t1).start();
new Thread(t12).start();
}
}
/**
* 方法上面加了锁定,结果任然计算不对,原因在于temp和temp2 不是同一个实例
* 加在代码块上,this相当于当前【实例】加锁,进入同步代码前要获得【当前实例】的锁
* 而这里的两个相同的线程传递的temp和temp2 ,不是同一个实例。
ThreedOne+++++:1
ThreedOne+++++:2
ThreedOne+++++:3
ThreedOne+++++:3
ThreedOne+++++:5
ThreedOne+++++:4
ThreedOne+++++:6
ThreedOne+++++:6
ThreedOne+++++:8
ThreedOne+++++:7
ThreedOne+++++:9
ThreedOne+++++:10
ThreedOne+++++:11
ThreedOne+++++:11
ThreedOne+++++:12
ThreedOne+++++:12
ThreedOne+++++:13
ThreedOne+++++:14
ThreedOne+++++:15
ThreedOne+++++:16
**/
package com.test.synchronize.four;
public class TestSynchronized {
public static void main(String[] args) {
CountTest temp = new CountTest();
ThreedOne t1= new ThreedOne(temp);
ThreedOne t12= new ThreedOne(temp);
new Thread(t1).start();
new Thread(t12).start();
}
}
/**
* 锁定成功了,原因在于两个线程使用的temp同一个实例
* 加在代码块上,this相当于当前【实例】加锁,进入同步代码前要获得【当前实例】的锁
ThreedOne+++++:1
ThreedOne+++++:2
ThreedOne+++++:3
ThreedOne+++++:4
ThreedOne+++++:5
ThreedOne+++++:6
ThreedOne+++++:7
ThreedOne+++++:8
ThreedOne+++++:9
ThreedOne+++++:10
ThreedOne+++++:11
ThreedOne+++++:12
ThreedOne+++++:13
ThreedOne+++++:14
ThreedOne+++++:15
ThreedOne+++++:16
ThreedOne+++++:17
ThreedOne+++++:18
ThreedOne+++++:19
ThreedOne+++++:20
**/
如果是:
synchronized (CountTest.class) 【指定类】加锁,即使是多个不同的实例也没有关系,也可以锁定住。
效果如:com.test.synchronize.five
package com.test.synchronize.five;
public class CountTest{
static int i=0;
/**
* 代码块的锁定synchronized (CountTest.class)与锁定方法以及synchronized (this)是不一样的。
* 多个不同的实例只要是相同的对象都可以锁定
* @return
*/
public int add(){
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (CountTest.class) {
i++;
}
return i;
}
}
package com.test.synchronize.five;
public class ThreedOne implements Runnable{
private CountTest countTest;
public CountTest getCountTest() {
return countTest;
}
public void setCountTest(CountTest countTest) {
this.countTest = countTest;
}
public ThreedOne(CountTest countTest){
this.countTest = countTest;
}
@Override
public void run() {
for(int j=0;j<50;j++){
System.out.println("ThreedOne+++++:"+this.countTest.add());
}
}
}
package com.test.synchronize.five;
public class Test {
public static void main(String[] args) {
CountTest temp = new CountTest();
CountTest temp2 = new CountTest();
ThreedOne t1= new ThreedOne(temp);
ThreedOne t12= new ThreedOne(temp2);
new Thread(t1).start();
new Thread(t12).start();
}
}
/**
*锁定成功。 synchronized (CountTest.class)
*
* 加在代码块上synchronized (CountTest.class),相当于当前对类加锁,进入同步代码前要获得【当前类】的锁
* 而这里的两个相同的线程传递的temp和temp2 ,不是同一个实例,但是是同一个类。
ThreedOne+++++:2
ThreedOne+++++:1
ThreedOne+++++:4
ThreedOne+++++:3
ThreedOne+++++:5
ThreedOne+++++:6
ThreedOne+++++:7
ThreedOne+++++:8
ThreedOne+++++:9
ThreedOne+++++:10
ThreedOne+++++:11
ThreedOne+++++:12
ThreedOne+++++:14
ThreedOne+++++:13
ThreedOne+++++:15
ThreedOne+++++:16
ThreedOne+++++:17
ThreedOne+++++:18
ThreedOne+++++:20
ThreedOne+++++:19
ThreedOne+++++:22
ThreedOne+++++:21
ThreedOne+++++:24
ThreedOne+++++:23
ThreedOne+++++:25
ThreedOne+++++:26
ThreedOne+++++:27
ThreedOne+++++:28
ThreedOne+++++:29
ThreedOne+++++:30
ThreedOne+++++:32
ThreedOne+++++:31
ThreedOne+++++:33
ThreedOne+++++:34
ThreedOne+++++:36
ThreedOne+++++:35
ThreedOne+++++:38
ThreedOne+++++:37
ThreedOne+++++:39
ThreedOne+++++:40
ThreedOne+++++:42
ThreedOne+++++:41
ThreedOne+++++:44
ThreedOne+++++:43
ThreedOne+++++:46
ThreedOne+++++:45
ThreedOne+++++:48
ThreedOne+++++:47
ThreedOne+++++:49
ThreedOne+++++:50
ThreedOne+++++:51
ThreedOne+++++:52
ThreedOne+++++:53
ThreedOne+++++:54
ThreedOne+++++:55
ThreedOne+++++:56
ThreedOne+++++:58
ThreedOne+++++:57
ThreedOne+++++:59
ThreedOne+++++:60
ThreedOne+++++:61
ThreedOne+++++:62
ThreedOne+++++:63
ThreedOne+++++:64
ThreedOne+++++:65
ThreedOne+++++:66
ThreedOne+++++:67
ThreedOne+++++:68
ThreedOne+++++:69
ThreedOne+++++:70
ThreedOne+++++:71
ThreedOne+++++:72
ThreedOne+++++:73
ThreedOne+++++:74
ThreedOne+++++:75
ThreedOne+++++:76
ThreedOne+++++:77
ThreedOne+++++:78
ThreedOne+++++:79
ThreedOne+++++:80
ThreedOne+++++:81
ThreedOne+++++:82
ThreedOne+++++:83
ThreedOne+++++:84
ThreedOne+++++:85
ThreedOne+++++:86
ThreedOne+++++:87
ThreedOne+++++:88
ThreedOne+++++:89
ThreedOne+++++:90
ThreedOne+++++:91
ThreedOne+++++:92
ThreedOne+++++:93
ThreedOne+++++:94
ThreedOne+++++:95
ThreedOne+++++:96
ThreedOne+++++:97
ThreedOne+++++:98
ThreedOne+++++:99
ThreedOne+++++:100
**/
package com.test.synchronize.five;
public class TestSynchronized {
public static void main(String[] args) {
CountTest temp = new CountTest();
ThreedOne t1= new ThreedOne(temp);
ThreedOne t12= new ThreedOne(temp);
new Thread(t1).start();
new Thread(t12).start();
}
}
/**
*锁定成功。 synchronized (CountTest.class)
*
* 加在代码块上synchronized (CountTest.class),相当于当前对类加锁,进入同步代码前要获得【当前类】的锁
* 而这里的两个相同的线程传递的同一个temp ,是同一个实例,也是同一个类。
ThreedOne+++++:1
ThreedOne+++++:2
ThreedOne+++++:4
ThreedOne+++++:3
ThreedOne+++++:5
ThreedOne+++++:6
ThreedOne+++++:7
ThreedOne+++++:8
ThreedOne+++++:10
ThreedOne+++++:9
ThreedOne+++++:11
ThreedOne+++++:12
ThreedOne+++++:13
ThreedOne+++++:14
ThreedOne+++++:15
ThreedOne+++++:16
ThreedOne+++++:17
ThreedOne+++++:18
ThreedOne+++++:19
ThreedOne+++++:20
ThreedOne+++++:21
ThreedOne+++++:22
ThreedOne+++++:23
ThreedOne+++++:24
ThreedOne+++++:26
ThreedOne+++++:25
ThreedOne+++++:27
ThreedOne+++++:28
ThreedOne+++++:30
ThreedOne+++++:29
ThreedOne+++++:31
ThreedOne+++++:32
ThreedOne+++++:33
ThreedOne+++++:34
ThreedOne+++++:36
ThreedOne+++++:35
ThreedOne+++++:38
ThreedOne+++++:37
ThreedOne+++++:40
ThreedOne+++++:39
ThreedOne+++++:41
ThreedOne+++++:42
ThreedOne+++++:43
ThreedOne+++++:44
ThreedOne+++++:45
ThreedOne+++++:46
ThreedOne+++++:47
ThreedOne+++++:48
ThreedOne+++++:49
ThreedOne+++++:50
ThreedOne+++++:51
ThreedOne+++++:52
ThreedOne+++++:53
ThreedOne+++++:54
ThreedOne+++++:55
ThreedOne+++++:56
ThreedOne+++++:57
ThreedOne+++++:58
ThreedOne+++++:59
ThreedOne+++++:60
ThreedOne+++++:61
ThreedOne+++++:62
ThreedOne+++++:63
ThreedOne+++++:64
ThreedOne+++++:65
ThreedOne+++++:66
ThreedOne+++++:67
ThreedOne+++++:68
ThreedOne+++++:69
ThreedOne+++++:70
ThreedOne+++++:71
ThreedOne+++++:72
ThreedOne+++++:73
ThreedOne+++++:74
ThreedOne+++++:75
ThreedOne+++++:76
ThreedOne+++++:77
ThreedOne+++++:78
ThreedOne+++++:79
ThreedOne+++++:80
ThreedOne+++++:81
ThreedOne+++++:82
ThreedOne+++++:83
ThreedOne+++++:84
ThreedOne+++++:85
ThreedOne+++++:86
ThreedOne+++++:87
ThreedOne+++++:88
ThreedOne+++++:89
ThreedOne+++++:90
ThreedOne+++++:91
ThreedOne+++++:92
ThreedOne+++++:93
ThreedOne+++++:94
ThreedOne+++++:95
ThreedOne+++++:96
ThreedOne+++++:97
ThreedOne+++++:98
ThreedOne+++++:99
ThreedOne+++++:100
**/
3. 加在静态方法(某个类的静态方法上),作用于当前【类对象】加锁,进入同步代码前要获得【当前类对象】的锁
public synchronized static int add()
可以锁定住,与synchronized (CountTest.class)效果类似。
效果如:com.test.synchronize.six
package com.test.synchronize.six;
public class CountTest{
static int i=0;
/**
* 加在静态方法(某个类的静态方法上),作用于当前【类对象】加锁,进入同步代码前要获得【当前类对象】的锁
* @return
*/
public synchronized static int add(){
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
return i;
}
}
package com.test.synchronize.six;
public class ThreedOne implements Runnable{
private CountTest countTest;
public CountTest getCountTest() {
return countTest;
}
public void setCountTest(CountTest countTest) {
this.countTest = countTest;
}
public ThreedOne(CountTest countTest){
this.countTest = countTest;
}
@Override
public void run() {
for(int j=0;j<50;j++){
System.out.println("ThreedOne+++++:"+this.countTest.add());
}
}
}
package com.test.synchronize.six;
public class Test {
public static void main(String[] args) {
CountTest temp = new CountTest();
CountTest temp2 = new CountTest();
ThreedOne t1= new ThreedOne(temp);
ThreedOne t12= new ThreedOne(temp2);
new Thread(t1).start();
new Thread(t12).start();
}
}
/**
*锁定成功。public synchronized static
*
* 相当于当前对类加锁,进入同步代码前要获得【当前类】的锁
* 而这里的两个相同的线程传递的temp和temp2 ,不是同一个实例,但是是同一个类。
ThreedOne+++++:2
ThreedOne+++++:1
ThreedOne+++++:4
ThreedOne+++++:3
ThreedOne+++++:5
ThreedOne+++++:6
ThreedOne+++++:7
ThreedOne+++++:8
ThreedOne+++++:9
ThreedOne+++++:10
ThreedOne+++++:11
ThreedOne+++++:12
ThreedOne+++++:14
ThreedOne+++++:13
ThreedOne+++++:15
ThreedOne+++++:16
ThreedOne+++++:17
ThreedOne+++++:18
ThreedOne+++++:20
ThreedOne+++++:19
ThreedOne+++++:22
ThreedOne+++++:21
ThreedOne+++++:24
ThreedOne+++++:23
ThreedOne+++++:25
ThreedOne+++++:26
ThreedOne+++++:27
ThreedOne+++++:28
ThreedOne+++++:29
ThreedOne+++++:30
ThreedOne+++++:32
ThreedOne+++++:31
ThreedOne+++++:33
ThreedOne+++++:34
ThreedOne+++++:36
ThreedOne+++++:35
ThreedOne+++++:38
ThreedOne+++++:37
ThreedOne+++++:39
ThreedOne+++++:40
ThreedOne+++++:42
ThreedOne+++++:41
ThreedOne+++++:44
ThreedOne+++++:43
ThreedOne+++++:46
ThreedOne+++++:45
ThreedOne+++++:48
ThreedOne+++++:47
ThreedOne+++++:49
ThreedOne+++++:50
ThreedOne+++++:51
ThreedOne+++++:52
ThreedOne+++++:53
ThreedOne+++++:54
ThreedOne+++++:55
ThreedOne+++++:56
ThreedOne+++++:58
ThreedOne+++++:57
ThreedOne+++++:59
ThreedOne+++++:60
ThreedOne+++++:61
ThreedOne+++++:62
ThreedOne+++++:63
ThreedOne+++++:64
ThreedOne+++++:65
ThreedOne+++++:66
ThreedOne+++++:67
ThreedOne+++++:68
ThreedOne+++++:69
ThreedOne+++++:70
ThreedOne+++++:71
ThreedOne+++++:72
ThreedOne+++++:73
ThreedOne+++++:74
ThreedOne+++++:75
ThreedOne+++++:76
ThreedOne+++++:77
ThreedOne+++++:78
ThreedOne+++++:79
ThreedOne+++++:80
ThreedOne+++++:81
ThreedOne+++++:82
ThreedOne+++++:83
ThreedOne+++++:84
ThreedOne+++++:85
ThreedOne+++++:86
ThreedOne+++++:87
ThreedOne+++++:88
ThreedOne+++++:89
ThreedOne+++++:90
ThreedOne+++++:91
ThreedOne+++++:92
ThreedOne+++++:93
ThreedOne+++++:94
ThreedOne+++++:95
ThreedOne+++++:96
ThreedOne+++++:97
ThreedOne+++++:98
ThreedOne+++++:99
ThreedOne+++++:100
**/
package com.test.synchronize.six;
public class TestSynchronized {
public static void main(String[] args) {
CountTest temp = new CountTest();
ThreedOne t1= new ThreedOne(temp);
ThreedOne t12= new ThreedOne(temp);
new Thread(t1).start();
new Thread(t12).start();
}
}
/**
*锁定成功。public synchronized static
*
* 相当于当前对类加锁,进入同步代码前要获得【当前类】的锁
* 而这里的两个相同的线程传递的同一个temp ,是同一个实例,也是同一个类。
ThreedOne+++++:1
ThreedOne+++++:2
ThreedOne+++++:4
ThreedOne+++++:3
ThreedOne+++++:5
ThreedOne+++++:6
ThreedOne+++++:7
ThreedOne+++++:8
ThreedOne+++++:10
ThreedOne+++++:9
ThreedOne+++++:11
ThreedOne+++++:12
ThreedOne+++++:13
ThreedOne+++++:14
ThreedOne+++++:15
ThreedOne+++++:16
ThreedOne+++++:17
ThreedOne+++++:18
ThreedOne+++++:19
ThreedOne+++++:20
ThreedOne+++++:21
ThreedOne+++++:22
ThreedOne+++++:23
ThreedOne+++++:24
ThreedOne+++++:26
ThreedOne+++++:25
ThreedOne+++++:27
ThreedOne+++++:28
ThreedOne+++++:30
ThreedOne+++++:29
ThreedOne+++++:31
ThreedOne+++++:32
ThreedOne+++++:33
ThreedOne+++++:34
ThreedOne+++++:36
ThreedOne+++++:35
ThreedOne+++++:38
ThreedOne+++++:37
ThreedOne+++++:40
ThreedOne+++++:39
ThreedOne+++++:41
ThreedOne+++++:42
ThreedOne+++++:43
ThreedOne+++++:44
ThreedOne+++++:45
ThreedOne+++++:46
ThreedOne+++++:47
ThreedOne+++++:48
ThreedOne+++++:49
ThreedOne+++++:50
ThreedOne+++++:51
ThreedOne+++++:52
ThreedOne+++++:53
ThreedOne+++++:54
ThreedOne+++++:55
ThreedOne+++++:56
ThreedOne+++++:57
ThreedOne+++++:58
ThreedOne+++++:59
ThreedOne+++++:60
ThreedOne+++++:61
ThreedOne+++++:62
ThreedOne+++++:63
ThreedOne+++++:64
ThreedOne+++++:65
ThreedOne+++++:66
ThreedOne+++++:67
ThreedOne+++++:68
ThreedOne+++++:69
ThreedOne+++++:70
ThreedOne+++++:71
ThreedOne+++++:72
ThreedOne+++++:73
ThreedOne+++++:74
ThreedOne+++++:75
ThreedOne+++++:76
ThreedOne+++++:77
ThreedOne+++++:78
ThreedOne+++++:79
ThreedOne+++++:80
ThreedOne+++++:81
ThreedOne+++++:82
ThreedOne+++++:83
ThreedOne+++++:84
ThreedOne+++++:85
ThreedOne+++++:86
ThreedOne+++++:87
ThreedOne+++++:88
ThreedOne+++++:89
ThreedOne+++++:90
ThreedOne+++++:91
ThreedOne+++++:92
ThreedOne+++++:93
ThreedOne+++++:94
ThreedOne+++++:95
ThreedOne+++++:96
ThreedOne+++++:97
ThreedOne+++++:98
ThreedOne+++++:99
ThreedOne+++++:100
**/
全部的代码可以到这里进行下载:https://download.csdn.net/download/tianshi1017/10741784