• 吴裕雄--天生自然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() ;
        }
    };
  • 相关阅读:
    hashlib加密算法
    gc 模块常用函数
    functools函数中的partial函数及wraps函数
    ctime使用及datetime简单使用
    __new__方法理解
    __getattribute__小例子
    == 和 is 的区别
    线程_可能发生的问题
    线程_进程池
    【网站】 简单通用微信QQ跳转浏览器打开代码
  • 原文地址:https://www.cnblogs.com/tszr/p/12152846.html
Copyright © 2020-2023  润新知