zoukankan      html  css  js  c++  java
  • 吴裕雄--天生自然java开发常用类库学习笔记:同步与死锁

    class MyThread implements Runnable{
        private int ticket = 5 ;    // 假设一共有5张票
        public void run(){
            for(int i=0;i<100;i++){
                if(ticket>0){    // 还有票
                    try{
                        Thread.sleep(300) ;    // 加入延迟
                    }catch(InterruptedException e){
                        e.printStackTrace() ;
                    }
                    System.out.println("卖票:ticket = " + ticket-- );
                }
            }
        }
    };
    public class SyncDemo01{
        public static void main(String args[]){
            MyThread mt = new MyThread() ;    // 定义线程对象
            Thread t1 = new Thread(mt) ;    // 定义Thread对象
            Thread t2 = new Thread(mt) ;    // 定义Thread对象
            Thread t3 = new Thread(mt) ;    // 定义Thread对象
            t1.start() ;
            t2.start() ;
            t3.start() ;
        }
    };
    class MyThread implements Runnable{
        private int ticket = 5 ;    // 假设一共有5张票
        public void run(){
            for(int i=0;i<100;i++){
                synchronized(this){    // 要对当前对象进行同步
                    if(ticket>0){    // 还有票
                        try{
                            Thread.sleep(300) ;    // 加入延迟
                        }catch(InterruptedException e){
                            e.printStackTrace() ;
                        }
                        System.out.println("卖票:ticket = " + ticket-- );
                    }
                }
            }
        }
    };
    public class SyncDemo02{
        public static void main(String args[]){
            MyThread mt = new MyThread() ;    // 定义线程对象
            Thread t1 = new Thread(mt) ;    // 定义Thread对象
            Thread t2 = new Thread(mt) ;    // 定义Thread对象
            Thread t3 = new Thread(mt) ;    // 定义Thread对象
            t1.start() ;
            t2.start() ;
            t3.start() ;
        }
    };
    class MyThread implements Runnable{
        private int ticket = 5 ;    // 假设一共有5张票
        public void run(){
            for(int i=0;i<100;i++){
                this.sale() ;    // 调用同步方法
            }
        }
        public synchronized void sale(){    // 声明同步方法
            if(ticket>0){    // 还有票
                try{
                    Thread.sleep(300) ;    // 加入延迟
                }catch(InterruptedException e){
                    e.printStackTrace() ;
                }
                System.out.println("卖票:ticket = " + ticket-- );
            }
    
        }
    };
    public class SyncDemo03{
        public static void main(String args[]){
            MyThread mt = new MyThread() ;    // 定义线程对象
            Thread t1 = new Thread(mt) ;    // 定义Thread对象
            Thread t2 = new Thread(mt) ;    // 定义Thread对象
            Thread t3 = new Thread(mt) ;    // 定义Thread对象
            t1.start() ;
            t2.start() ;
            t3.start() ;
        }
    };
    class Zhangsan{    // 定义张三类
        public void say(){
            System.out.println("张三对李四说:“你给我画,我就把书给你。”") ;
        }
        public void get(){
            System.out.println("张三得到画了。") ;
        }
    };
    class Lisi{    // 定义李四类
        public void say(){
            System.out.println("李四对张三说:“你给我书,我就把画给你”") ;
        }
        public void get(){
            System.out.println("李四得到书了。") ;
        }
    };
    public class ThreadDeadLock implements Runnable{
        private static Zhangsan zs = new Zhangsan() ;        // 实例化static型对象
        private static Lisi ls = new Lisi() ;        // 实例化static型对象
        private boolean flag = false ;    // 声明标志位,判断那个先说话
        public void run(){    // 覆写run()方法
            if(flag){
                synchronized(zs){    // 同步张三
                    zs.say() ;
                    try{
                        Thread.sleep(500) ;
                    }catch(InterruptedException e){
                        e.printStackTrace() ;
                    }
                    synchronized(ls){
                        zs.get() ;
                    }
                }
            }else{
                synchronized(ls){
                    ls.say() ;
                    try{
                        Thread.sleep(500) ;
                    }catch(InterruptedException e){
                        e.printStackTrace() ;
                    }
                    synchronized(zs){
                        ls.get() ;
                    }
                }
            }
        }
        public static void main(String args[]){
            ThreadDeadLock t1 = new ThreadDeadLock() ;        // 控制张三
            ThreadDeadLock t2 = new ThreadDeadLock() ;        // 控制李四
            t1.flag = true ;
            t2.flag = false ;
            Thread thA = new Thread(t1) ;
            Thread thB = new Thread(t2) ;
            thA.start() ;
            thB.start() ;
        }
    };
  • 相关阅读:
    网页爬虫小记:两种方式的爬取网站内容
    AOP中使用Aspectj对接口访问权限进行访问控制
    Spring Boot应用总结更新
    SpringBoot集成mybatis配置
    经验收集
    关于阿拉伯文开发的一点经验
    关于IDataReader.GetSchemaTable的一些事情
    removing vmware debugger from visual studio
    SQL Server 2008 R2 附加数据库 “尝试打开或创建物理文件 拒绝访问”的解决办法
    Visual Studio 2013 ReportViewer Control
  • 原文地址:https://www.cnblogs.com/tszr/p/12152846.html
Copyright © 2011-2022 走看看