Java线程同步与锁 - 日理万妓 2022-07-14 00:23 287阅读 0赞 **一、多线程同步** 当AB两个线程同时竞争资源时,A线程先获取到资源执行,B线程处于阻塞状态,A线程释放资源后,B线程从挂起处继续执行。 测试代码: public class WaitNotifyDemo { public class PrinterA implements Runnable { @Override public void run() { System.out.println("A start"); synchronized (WaitNotifyDemo.this) { System.out.println("A begin " + System.currentTimeMillis()); try { Thread.sleep(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("A end " + System.currentTimeMillis()); } } } public class PrinterB implements Runnable { @Override public void run() { System.out.println("B start"); synchronized (WaitNotifyDemo.this) { System.out.println("B begin " + System.currentTimeMillis()); try { Thread.sleep(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("B end " + System.currentTimeMillis()); } } } public static void main(String[] args) { WaitNotifyDemo demo = new WaitNotifyDemo(); demo.doPrint(); } private void doPrint() { PrinterA pa = new PrinterA(); PrinterB pb = new PrinterB(); Thread a = new Thread(pa); Thread b = new Thread(pb); a.start(); b.start(); } } 输出结果: A start B start A begin 1479709224158 A end 1479709234158 B begin 1479709234158 B end 1479709244159 看出AB线程start后,都各自输出自己的“start”,因为A线程先开始,所以先获取到资源,然后A线程调用sleep方法休眠10秒,此时B线程处于阻塞状态。10秒后A线程释放锁,B线程进入锁,继续执行下去。 **二、多线程锁** 需求:A线程打印123,B线程打印456,然后A线程再打印789 这时候需要线程锁来达到线程间交互。 首先B线程使用wait()方法挂起,A线程打印132并且使用notify()方法唤醒B线程,A线程自身挂起,B线程开始打印465然后使用notify()方法唤醒A线程,B线程自身挂起。 注意无论是wait,还是notify,notifyAll方法都需要在其实例对象的同步块中执行,这样当前线程才能获得同步实例的同步控制权,如果不在同步块中执行wait或者notify方法会出现java.lang.IllegalMonitorStateException异常。 测试代码: public class WaitNotifyDemo { private volatile int val = 1; private synchronized void printAndIncrease() { System.out.println(Thread.currentThread().getName() + " prints " + val); val++; } // print 1,2,3 7,8,9 public class PrinterA implements Runnable { @Override public void run() { while (val <= 3) { printAndIncrease(); } // print 1,2,3 then notify printerB synchronized (WaitNotifyDemo.this) { System.out.println("PrinterA printed 1,2,3; notify PrinterB"); WaitNotifyDemo.this.notify(); } try { while (val <= 6) { synchronized (WaitNotifyDemo.this) { System.out.println("wait in printerA"); WaitNotifyDemo.this.wait(); } } System.out.println("wait end printerA"); } catch (InterruptedException e) { e.printStackTrace(); } while (val <= 9) { printAndIncrease(); } System.out.println("PrinterA exits"); } } // print 4,5,6 after printA print 1,2,3 public class PrinterB implements Runnable { @Override public void run() { while (val < 3) { synchronized (WaitNotifyDemo.this) { try { System.out .println("printerB wait for printerA printed 1,2,3"); WaitNotifyDemo.this.wait(); System.out .println("printerB waited for printerA printed 1,2,3"); } catch (InterruptedException e) { e.printStackTrace(); } } } while (val <= 6) { printAndIncrease(); } System.out.println("notify in printerB"); synchronized (WaitNotifyDemo.this) { WaitNotifyDemo.this.notify(); } System.out.println("notify end printerB"); System.out.println("PrinterB exits."); } } public static void main(String[] args) { WaitNotifyDemo demo = new WaitNotifyDemo(); demo.doPrint(); } private void doPrint() { PrinterA pa = new PrinterA(); PrinterB pb = new PrinterB(); Thread a = new Thread(pa); a.setName("printerA"); Thread b = new Thread(pb); b.setName("printerB"); // 必须让b线程先执行,否则b线程有可能得不到锁,执行不了wait,而a线程一直持有锁,会先notify了 b.start(); a.start(); } } 输出结果: printerB wait for printerA printed 1,2,3 printerA prints 1 printerA prints 2 printerA prints 3 PrinterA printed 1,2,3; notify PrinterB printerB waited for printerA printed 1,2,3 printerB prints 4 printerB prints 5 printerB prints 6 notify in printerB notify end printerB PrinterB exits. wait end printerA printerA prints 7 printerA prints 8 printerA prints 9 PrinterA exits 参考: [http://outofmemory.cn/java/java.util.concurrent/thread-sync-with-object-wait-notify-notifyAll][http_outofmemory.cn_java_java.util.concurrent_thread-sync-with-object-wait-notify-notifyAll] [http_outofmemory.cn_java_java.util.concurrent_thread-sync-with-object-wait-notify-notifyAll]: http://outofmemory.cn/java/java.util.concurrent/thread-sync-with-object-wait-notify-notifyAll
相关 Java多线程问题:线程同步与死锁 在Java多线程编程中,线程同步和死锁是两个关键概念。 1. 线程同步: - **synchronized关键字**:这是Java中最常用的同步机制。在一个方法或者代码 太过爱你忘了你带给我的痛/ 2024年09月10日 16:45/ 0 赞/ 29 阅读
相关 java 线程同步锁 package com; import java.text.SimpleDateFormat; import java.util.Date... 淡淡的烟草味﹌/ 2024年04月18日 11:09/ 0 赞/ 38 阅读
相关 Java线程:线程的同步与锁 本文转载至:[http://lavasoft.blog.51cto.com/62575/99155][http_lavasoft.blog.51cto.com_62575_99 爱被打了一巴掌/ 2024年02月17日 21:13/ 0 赞/ 35 阅读
相关 java线程(二):线程同步与同步锁 在前一篇中已经介绍了如何创建线程以及对线程的五种状态有了基本的认识。本次主要分析线程中一个重要的问题线程同步以及如何同步。 为什么要对线程进行同步? 线程有可能和 傷城~/ 2022年09月22日 11:57/ 0 赞/ 267 阅读
相关 java锁,线程同步 java实现线程的方式一般用实现Runnable接口或者继承Thread 一般使用实现Runnable接口更多,因为这样可以更加轻易进行数据共享,也更容易实现同步,因为不同 今天药忘吃喽~/ 2022年09月10日 01:14/ 0 赞/ 179 阅读
相关 Java线程:线程的同步与锁 Java线程:线程的同步与锁 一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA 一时失言乱红尘/ 2022年08月24日 01:55/ 0 赞/ 88 阅读
相关 Java线程同步与锁 一、多线程同步 当AB两个线程同时竞争资源时,A线程先获取到资源执行,B线程处于阻塞状态,A线程释放资源后,B线程从挂起处继续执行。 测试代码: public c - 日理万妓/ 2022年07月14日 00:23/ 0 赞/ 288 阅读
相关 Java基础-线程同步、线程锁 线程不同步,会导致数据不同步 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。 落日映苍穹つ/ 2022年01月22日 12:07/ 0 赞/ 375 阅读
相关 Java 进程/线程与线程同步/死锁 一、进程与线程概念 1、并发和并行是即相似又有区别: 并发:指两个或多个事件在同一时间段内发生。 并行:指两个或多个事件在同一时刻点发 左手的ㄟ右手/ 2021年11月27日 05:12/ 0 赞/ 430 阅读
还没有评论,来说两句吧...