• 线程操作


    线程同步

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

    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(); } }
  • 相关阅读:
    Windows Server 2003 R2 IIS服务的命令行方式重启命令
    DWZ学习记录--关闭loading效果
    td顶部对齐
    struts2 iterator 迭代标签只显示前五条记录
    struts2 select 默认选中
    struts2 select标签
    s:select 标签中list存放map对象的使用
    struts2中<s:select>标签的使用
    eclipse在Windows7 64 位下出现Unhandled event loop exception No more handles
    Jquery焦点图/幻灯片效果 插件 KinSlideshow
  • 原文地址:https://www.cnblogs.com/zhuangjb/p/3189932.html
Copyright © 2020-2023  润新知