synchronized的几种用法和效果

---------------------------------------------------------------------------------------------------------------------------------------------

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值