zoukankan      html  css  js  c++  java
  • synchronized理解与总结

    synchronized理解与总结

    • 第一次实现的代码分析(不一定哪个线程抢到任务,抢到的线程会一直把任务执行完,不给其它线程机会)
    环境模拟:假设车站的车票开放给三个票贩子卖
    
    class MyThread implements Runnable {
    	private int ticket = 10 ; //初始设置票数为10
    	@Override
    	public void run() {       //车站的卖票系统
    		System.out.println(Thread.currentThread().getName() + "报道,准备抢任务") ;  //谁第一个报道,谁就抢到了机会
    		synchronized (this) {
    			while(this.ticket > 0) {  //观察循环的位置,一旦某一个票贩子(线程)抢到了机会,就会一直循环卖完票为止,过程中一直在执行循环体,不会跳出synchronized锁,别人再没有机会抢了
    				System.out.println(Thread.currentThread().getName() + "卖出一张票,剩余票数" + --this.ticket + "张。") ;
    			}
    		}
    	}
    }
    
    以上代码的确解决了数据安全问题,但是又回归到了单线程时的现象,只能一个线程程序执行到底,但是是哪个线程并不确定,要看哪个线程能抢到
    
    • 改进后的代码分析(所有线程都参与了计算)
    class MyThread implements Runnable {
    	private int ticket = 10 ; //初始设置票数为10
    	@Override
    	public void run() {       //车站的卖票系统
    		System.out.println(Thread.currentThread().getName() + "报道,准备抢任务") ;  //第一个报道的就抢到第一次机会,但后面几次依然要重新抢机会
    		while(this.ticket > 0) {
    			synchronized (this) {  //主要是观察synchronized在程序中出现的位置
    				if (this.ticket > 0 ) System.out.println(Thread.currentThread().getName() + "卖出一张票,剩余票数" + --this.ticket + "张。") ;
    			}
    		}
    	}
    }
    
    为了数据安全,只能允许同一时间一个线程运行,但是每一次循环所有线程都将再次有机会抢到任务,所以结果是多个线程参与了计算。
    
    • 附:主方法测试代码
    public class Hello {
    	public static void main(String[] args) {
    	Runnable ru = new MyThread() ;
    		new Thread(ru,"票贩子1").start() ;
    		new Thread(ru,"票贩子2").start() ;
    		new Thread(ru,"票贩子3").start() ;
    	}
    }
    
  • 相关阅读:
    Could not resolve com.android.support:appcompat-v7:28.0.0 错误处理
    解决 Could not resolve com.android.tools.build:gradle:3.1.3
    https://maven.google.com 连接不上的解决办法(转)
    jquery操作select(取值,设置选中)
    django 使用 request 获取浏览器发送的参数
    jquery下载,实时更新jquery1.2到最新3.3.1所有版本下载
    myeclipse 8.5反编译插件失效
    再探java基础——对面向对象的理解(2)
    庖丁解牛FPPopover
    去大连
  • 原文地址:https://www.cnblogs.com/haixianet/p/8652445.html
Copyright © 2011-2022 走看看