• 线程操作


    线程同步

    当多个线程同时进程一种资源操作,为保证操作的完整性,引入了同步处理。

    class MyThread2 implements Runnable{
        private int ticket=10;
        public void run(){
            for(int i=0;i<50;i++){          
    
                    if(this.ticket>0){    
    
                        System.out.println(Thread.currentThread().getName()+"买票;余票"+this.ticket);
                        this.ticket--;
                    }
            }
        }
    }
    public class SynDemo1 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            MyThread2 mt1=new MyThread2();
            new Thread(mt1,"线程A").start();
            new Thread(mt1,"线程B").start();
            new Thread(mt1,"线程C").start();
        }
    
    }

    但是,从实际的操作看,都使用网络卖票,则有可能出现网络延迟

    class MyThread2 implements Runnable{
        private int ticket=10;
        public void run(){
            for(int i=0;i<50;i++){        
                    if(this.ticket>0){    
                        try{
                            Thread.sleep(300);
                        }
                        catch (Exception e){}
                        System.out.println(Thread.currentThread().getName()+"买票;余票"+this.ticket);
                        this.ticket--;
                    }
            }
        }
    }
    public class SynDemo1 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            MyThread2 mt1=new MyThread2();
            new Thread(mt1,"线程A").start();
            new Thread(mt1,"线程B").start();
            new Thread(mt1,"线程C").start();
        }
    
    }

    本程序中可以发现一旦加入了延迟之后,买出的票数就不准确了。
    由于现在是有多个线程操作,那么最好的解决方法是加入一个锁的标记,锁标记中将判断和修改同时进行,要想完成这种锁的程序可以通过两种语句实现,同步代码块,同步方法。

    class MyThread2 implements Runnable{
        private int ticket=10;
        public void run(){
            for(int i=0;i<50;i++){
                this.sale();
            }
        }
        public synchronized void sale(){
            if(this.ticket>0){    
                try{
                    Thread.sleep(300);
                }
                catch (Exception e){}
                System.out.println(Thread.currentThread().getName()+"买票;余票"+this.ticket);
                this.ticket--;
            }
        }
    //代码块同步  
    /*public void run(){ for(int i=0;i<50;i++){ synchronized(this){ if(this.ticket>0){ try{ Thread.sleep(300); } catch (Exception e){} System.out.println(Thread.currentThread().getName()+"买票;余票"+this.ticket); this.ticket--; } } } }*/ } public class SynDemo1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MyThread2 mt1=new MyThread2(); new Thread(mt1,"线程A").start(); new Thread(mt1,"线程B").start(); new Thread(mt1,"线程C").start(); } }
  • 相关阅读:
    冒泡排序
    python isinstance 函数
    2.x与3.x差异、条件语句、数据类型、其他
    区间结构
    配置文件监听器
    Enumerable扩展方法
    EsayUI + MVC + ADO.NET(项目架构)
    vue.js 官网及组件网站记录
    vue.js 二维码生成组件
    分享一些学习资料-大量PDF电子书
  • 原文地址:https://www.cnblogs.com/zhuangjb/p/3189932.html
Copyright © 2020-2023  润新知