千家信息网

Java多线程同步实现的方式是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"Java多线程同步实现的方式是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java多线程同步实现的方式是什么"吧!给我一把锁
千家信息网最后更新 2026年10月31日Java多线程同步实现的方式是什么

这篇文章主要讲解了"Java多线程同步实现的方式是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java多线程同步实现的方式是什么"吧!

给我一把锁,我能创造一个规矩

很多人都知道,在Java多线程编程中,有一个重要的关键字,synchronized。但是很多人看到这个东西会感到困惑:"都说同步机制是通过对象锁来实现的,但是这么一个关键字,我也看不出来Java程序锁住了哪个对象阿?"

没错,我一开始也是对这个问题感到困惑和不解。不过还好,我们有下面的这个例程:

public class ThreadTest extends Thread {  private int threadNo;  public ThreadTest(int threadNo) {  this.threadNo = threadNo;  }  public static void main(String[] args) throws Exception {  for (int i = 1; i < 10; i++) {  new ThreadTest(i).start();  Thread.sleep(1);  }  }  @Override public synchronized void run() {  for (int i = 1; i < 10000; i++) {  System.out.println("No." + threadNo + ":" + i);  }  }  }

这个程序其实就是让10个线程在控制台上数数,从1数到9999。理想情况下,我们希望看到一个线程数完,然后才是另一个线程开始数数。但是这个程序的执行过程告诉我们,这些线程还是乱糟糟的在那里抢着报数,丝毫没有任何规矩可言。

但是细心的读者注意到:run方法还是加了一个synchronized关键字的,按道理说,这些线程应该可以一个接一个的执行这个run方法才对阿。

但是通过上一篇中,我们提到的,对于一个成员方法加synchronized关键字,这实际上是以这个成员方法所在的对象本身作为对象锁。在本例中,就是以ThreadTest类的一个具体对象,也就是该线程自身作为对象锁的。一共十个线程,每个线程持有自己 线程对象的那个对象锁。这必然不能产生同步的效果。换句话说,如果要对这些线程进行同步,那么这些线程所持有的对象锁应当是共享且***的!

我们来看下面的例程:

public class ThreadTest2 extends Thread {  private int threadNo;  private String lock;  public ThreadTest2(int threadNo, String lock) {  this.threadNo = threadNo;  this.lock = lock;  }  public static void main(String[] args) throws Exception {  String lock = new String("lock");  for (int i = 1; i < 10; i++) {  new ThreadTest2(i, lock).start();  Thread.sleep(1);  }  }  public void run() {  synchronized (lock) {  for (int i = 1; i < 10000; i++) {  System.out.println("No." + threadNo + ":" + i);  }  }  }  }

我们注意到,该程序通过在main方法启动10个线程之前,创建了一个String类型的对象。并通过ThreadTest2的构造函数,将这个对象赋值给每一个ThreadTest2线程对象中的私有变量lock。根据Java方法的传值特点,我们知道,这些线程的lock变量实际上指向的是堆内存中的同一个区域,即存放main函数中的lock变量的区域。

程序将原来run方法前的synchronized关键字去掉,换用了run方法中的一个synchronized块来实现。这个同步块的对象锁,就是 main方法中创建的那个String对象。换句话说,他们指向的是同一个String类型的对象,对象锁是共享且***的!

于是,我们看到了预期的效果:10个线程不再是争先恐后的报数了,而是一个接一个的报数。

再来看下面的例程:

public class ThreadTest3 extends Thread {  private int threadNo;  private String lock;  public ThreadTest3(int threadNo) {  this.threadNo = threadNo;  }  public static void main(String[] args) throws Exception {  //String lock = new String("lock");  for (int i = 1; i < 20; i++) {  new ThreadTest3(i).start();  Thread.sleep(1);  }  }  public static synchronized void abc(int threadNo) {  for (int i = 1; i < 10000; i++) {  System.out.println("No." + threadNo + ":" + i);  }  }  public void run() {  abc(threadNo);  }  }

细心的读者发现了:这段代码没有使用main方法中创建的String对象作为这10个线程的线程锁。而是通过在run方法中调用本线程中一个静态的同步方法abc而实现了线程的同步。我想看到这里,你们应该很困惑:这里synchronized静态方法是用什么来做对象锁的呢?

我们知道,对于同步静态方法,对象锁就是该静态放发所在的类的Class实例,由于在JVM中,所有被加载的类都有***的类对象,具体到本例,就是***的 ThreadTest3.class对象。不管我们创建了该类的多少实例,但是它的类实例仍然是一个!

这样我们就知道了:

1、对于同步的方法或者代码块来说,必须获得对象锁才能够进入同步方法或者代码块进行操作;

2、如果采用method级别的同步,则对象锁即为method所在的对象,如果是静态方法,对象锁即指method所在的
Class对象(***);

3、对于代码块,对象锁即指synchronized(abc)中的abc;

4、因为***种情况,对象锁即为每一个线程对象,因此有多个,所以同步失效,第二种共用同一个对象锁lock,因此同步生效,第三个因为是static因此对象锁为ThreadTest3的class 对象,因此同步生效。

如上述正确,则同步有两种方式,同步块和同步方法(为什么没有wait和notify?这个我会在补充章节中做出阐述)

如果是同步代码块,则对象锁需要编程人员自己指定,一般有些代码为synchronized(this)只有在单态模式才生效;
(本类的实例有且只有一个)

如果是同步方法,则分静态和非静态两种。

静态方法则一定会同步,非静态方法需在单例模式才生效,推荐用静态方法(不用担心是否单例)。

所以说,在Java多线程编程中,最常见的synchronized关键字实际上是依靠对象锁的机制来实现线程同步的。
我们似乎可以听到synchronized在向我们说:"给我一把锁,我能创造一个规矩"。

感谢各位的阅读,以上就是"Java多线程同步实现的方式是什么"的内容了,经过本文的学习后,相信大家对Java多线程同步实现的方式是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

对象 线程 同步 方法 静态 代码 关键 关键字 方式 就是 程序 实例 所在 困惑 变量 实际 实际上 情况 规矩 面的 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡豆 保险科技 互联网保险 百单网互联网科技有限公司 互联网科技排名 华中科技大学互联网 汇久创客互联网科技 互联网科技小额贷款 美国互联网前沿科技 无锡溥仪互联网科技有限公司 互联网科技创新企业排名 互联网公司会议桌创意科技软装饰 湖北码尼互联网科技有限公司电话 彤创互联网科技有限公司 互联网科技公司有风险吗 广州市恰铎互联网科技有限公司 朱啸虎曾投资哪些互联网科技企业 伍佰万互联网科技怎么赚钱 互联网与数字科技关系 江苏互联网科技小贷 互联网时代高科技布局 深圳市人人互联网科技有限公司 金融科技 互联网金融 易互联网科技有限公司 农村开互联网科技讲堂 福建科技产业互联网发展 湖南一路畅行互联网科技 新兴科技互联网创新大赛颁奖典礼 互联网新科技动漫ppt素材 众安科技工业互联网合作 山东亿川互联网科技有限责任公司
0