【Java基础】多线程之synchronized

本文介绍Java中synchronized关键字的作用及其实现原理,并通过示例代码展示如何使用synchronized解决多线程环境下资源竞争的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要用synchronized


          多线程可以提高效率,但是在共享变量的情况下,可能出现混乱的情况,比如A线程将共享变量 m=5,但是B线程在用m变量的时候,出现了混乱。这样多个线程共同访问同样的一个资源,你争我夺,一团乱。线程的不安全现象一触即发。所以必须要对这种资源冲突进行预防。

      所以,在共同访问的资源进行加锁即可,第一种方法就是同步锁,也即用关键字synchronized。该关键字可以加在方法和语句块中,也即是同步方法和同步语句块。

synchronized原理

           各个线程在调用关键字synchronized方法或者语句块的时候,需要排队进行。当A线程在调用该方法(或者语句块)的时候,要在该方法(或者语句块)上锁,B线程则等待,当然可以以异步的方法调用非synchronized方法。当A线程释放了synchronized方法(或者语句块),B线程才可以调用该方法。
    
       synchronized关键字还可以实现可重入锁,也就是一个线程连续几次获取同一把锁。

案例分析


      首先是方法类,代码如下:

package cn.itcast.java.base.synchronize;

public class Task
{
  public void doLongTimeTask()
  {
	  for (int i = 0; i < 100; i++)
	{
		System.out.println("nosynchronized threadName="
	+Thread.currentThread().getName()+"i="+(i+1));
		
	}
	  System.out.println("");
	  synchronized (this)
	{
		for (int i = 0; i < 100; i++)
		{
			System.out.println("synchronized threadName="
	+Thread.currentThread().getName()+"i="+(i+1));
		}
	}
  }
}

      接下来是自定义的线程类,这里一共有2个线程:

package cn.itcast.java.base.synchronize;

public class MyThread1 extends Thread
{
  private Task task;
  public MyThread1(Task task){
	  super();
	  this.task=task;
  }
 public void run(){
	 super.run();
	 task.doLongTimeTask();
 }
  
}

package cn.itcast.java.base.synchronize;

public class MyThread2 extends Thread
{
  private Task task;
  public MyThread2(Task task){
	  super();
	  this.task=task;
  }
 public void run(){
	 super.run();
	 task.doLongTimeTask();
 }
  
}




    接下来是run方法:

    
package cn.itcast.java.base.synchronize;

public class Run
{
 public static void main(String[] args)
{
	Task task=new Task();
	MyThread1 thread1=new MyThread1(task);
	thread1.start();
	MyThread2 thread2=new MyThread2(task);
	thread2.start();
}
}
   
     我们看一下运行结果:

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

nosynchronized threadName=Thread-1i=76
synchronized threadName=Thread-0i=1
nosynchronized threadName=Thread-1i=77
synchronized threadName=Thread-0i=2
nosynchronized threadName=Thread-1i=78
synchronized threadName=Thread-0i=3
synchronized threadName=Thread-0i=4
synchronized threadName=Thread-0i=5
nosynchronized threadName=Thread-1i=79
synchronized threadName=Thread-0i=6
nosynchronized threadName=Thread-1i=80
synchronized threadName=Thread-0i=7
nosynchronized threadName=Thread-1i=81
synchronized threadName=Thread-0i=8
synchronized threadName=Thread-0i=9
synchronized threadName=Thread-0i=10
synchronized threadName=Thread-0i=11
synchronized threadName=Thread-0i=12
synchronized threadName=Thread-0i=13
synchronized threadName=Thread-0i=14
synchronized threadName=Thread-0i=15
synchronized threadName=Thread-0i=16
synchronized threadName=Thread-0i=17
synchronized threadName=Thread-0i=18
synchronized threadName=Thread-0i=19
synchronized threadName=Thread-0i=20
synchronized threadName=Thread-0i=21
synchronized threadName=Thread-0i=22
synchronized threadName=Thread-0i=23
nosynchronized threadName=Thread-1i=82
synchronized threadName=Thread-0i=24
nosynchronized threadName=Thread-1i=83
synchronized threadName=Thread-0i=25
nosynchronized threadName=Thread-1i=84
synchronized threadName=Thread-0i=26
nosynchronized threadName=Thread-1i=85
synchronized threadName=Thread-0i=27
nosynchronized threadName=Thread-1i=86
synchronized threadName=Thread-0i=28
nosynchronized threadName=Thread-1i=87
synchronized threadName=Thread-0i=29
nosynchronized threadName=Thread-1i=88
synchronized threadName=Thread-0i=30
synchronized threadName=Thread-0i=31
synchronized threadName=Thread-0i=32
synchronized threadName=Thread-0i=33
nosynchronized threadName=Thread-1i=89
synchronized threadName=Thread-0i=34
nosynchronized threadName=Thread-1i=90
synchronized threadName=Thread-0i=35
nosynchronized threadName=Thread-1i=91
synchronized threadName=Thread-0i=36
nosynchronized threadName=Thread-1i=92
synchronized threadName=Thread-0i=37
nosynchronized threadName=Thread-1i=93
synchronized threadName=Thread-0i=38
nosynchronized threadName=Thread-1i=94
nosynchronized threadName=Thread-1i=95
nosynchronized threadName=Thread-1i=96
nosynchronized threadName=Thread-1i=97
synchronized threadName=Thread-0i=39
nosynchronized threadName=Thread-1i=98
synchronized threadName=Thread-0i=40
nosynchronized threadName=Thread-1i=99
synchronized threadName=Thread-0i=41
nosynchronized threadName=Thread-1i=100

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

          用synchronized(this)来锁定当前对象,通过语句块来进行同步。
     
       
        

  
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值