线程同步的三种方式 线程同步的三种方式 1. 同步代码块。 2. 同步方法。 3. 锁机制。 同步代码块: synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。 synchronized(同步锁){ 需要同步操作的代码 } 同步锁: 对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁. 1. 锁对象 可以是任意类型。 2. 多个线程对象 要使用同一把锁。 / * 同步代码块 */ public class Ticket implements Runnable { private int ticket = 100; Object lock=new Object(); @Override public void run() { while(true){ synchronized(lock){ if (ticket>0){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+” 正在卖:”+ticket–+”张票!”); } } } } } 同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外 等着。 public synchronized void method(){ 可能会产生线程安全问题的代码 } / * 同步方法 */ public class Ticket01 implements Runnable { private int ticket = 100; @Override public void run() { while(true){ sellTicket(); } } public synchronized void sellTicket(){ if (ticket>0){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+” 正在卖:”+ticket–+”张票!”); } } } 对于非static方法,同步锁就是this。 对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。 Lock锁机制:java.util.concurrent.locks.Lock 机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作, 同步代码块/同步方法具有的功能Lock都有, 除此之外更强大,更体现面向对象。 Lock锁也称同步锁,加锁与释放锁方法化了,如下: public void lock() :加同步锁。 public void unlock() :释放同步锁 / * Lock锁机制 */ public class Ticket02 implements Runnable { private int ticket = 100; Lock lock = new ReentrantLock(); @Override public void run() { while(true){ lock.lock(); if (ticket>0){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+” 正在卖:”+ticket–+”张票!”); } lock.unlock(); } } }
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/70932.html