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
    }
  • 相关阅读:
    Java 泛型的使用
    IDEA 2017.2.2 环境下使用JUnit
    Tomcat的下载安装及使用
    JavaScript基础知识(二)
    JavaScript基础知识(一)
    CSS3基础(4)——CSS3 渲染属性
    CSS3基础(3)——CSS3 布局属性全接触
    CSS3基础(2)—— 文字与字体相关样式、盒子类型、背景与边框相关样式、变形处理、动画功能
    CSS3 基础(1)——选择器详解
    CSS基础学习笔记
  • 原文地址:https://www.cnblogs.com/zxfei/p/10913497.html
Copyright © 2011-2022 走看看