zoukankan      html  css  js  c++  java
  • Java中实现线程同步的三种方法

    实现同步的三种方法

    多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步。
    实现同步的三种方法:

    1. 使用同步代码块
    2. 使用同步方法
    3. 使用互斥锁ReetrantLock(更灵活的代码控制)

    代码示例:

    import java.util.concurrent.locks.ReentrantLock;
    
    
    public class SyncThreadDemo {
    
    	public static void main(String[] args) {
    		MyRunnable mr = new MyRunnable();
    
    		new Thread(mr).start();
    		new Thread(mr).start();
    	}
    
    }
    
    class MyRunnable implements Runnable {
    
    	private int tickts = 10;
    
    	@Override
    	public void run() {
    
    		for (int i = 0; i < 100; i++) {
    //			if (tickts > 0) {
    			// 方法一:使用同步代码块
    //				synchronized (this) {
    //					System.out.println("第" + (tickts--) + "张票售出");
    //					try {
    //						Thread.sleep(100);
    //					} catch (InterruptedException e) {
    //						e.printStackTrace();
    //					}
    //				}
    //			}
    			// 方法二:使用同步方法达到线程安全
    			saleTickts();
    		
    			// 方法三:使用ReentrantLock,更加灵活,可以加入判断,在特定的情况下释放锁
    			saleTickts2();
    		}// for
    	}
    
    	// 同步方法:同步的是当前对象
    	private synchronized void saleTickts() {
    		if (tickts > 0) {
    			System.out.println("第" + (tickts--) + "张票售出");
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}// saleTickts
    
    	ReentrantLock lock = new ReentrantLock();
    
    	// 方法三:使用ReentrantLock,更加灵活,可以加入判断,在特定的情况下释放锁
    	private void saleTickts2() {
    		lock.lock();
    		try {
    			if (tickts > 0) {
    				System.out.println("第" + (tickts--) + "张票售出");
    				try {
    					Thread.sleep(100);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    			// 保证锁一定会被释放,不会出现死锁情况
    		} finally {
    			lock.unlock();// 释放锁
    		}
    	}// saleTickts2
    }
  • 相关阅读:
    4-MSP430定时器_定时器中断
    关于STM32的外部引脚中断的问题
    关于stm32的正交解码
    红外接收控制灯亮灭
    mack pro常用快捷键
    liunx操作系统安装<一>
    支付宝架构师:从工程师到架构师的成长之路
    maven之setting.xml的配置详解
    分布式之《保证分布式系统数据一致性的6种解决方案》
    Eclipse中jsp、js文件编辑时,卡死现象解决汇总
  • 原文地址:https://www.cnblogs.com/zxfei/p/10913497.html
Copyright © 2011-2022 走看看