同步和死锁(三)上

简介: 同步和死锁(三)

一. 同步


同步,就是加锁,避免同一个资源访问时会出现的问题。


还是以以前的卖票程序进行举例。


一.一 这是不加同步的


public static void main(String[] args) {
        test5();
    }
    public static void test5(){
        //实例化一次对象
        MyRunnableDemo5 myRunnableDemo1=new MyRunnableDemo5();
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo1);
        Thread thread3=new Thread(myRunnableDemo1);
        //启动, 三个客户端进行抢票
        thread1.start();
        thread2.start();
        thread3.start();
    }
     static class  MyRunnableDemo5 implements Runnable{
        private int ticket=5;
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                if(ticket>0){
                    //加上一个延时,表示卖票需要耗费时间差。
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("还剩下:"+ticket+"张票");
                    ticket--;
                }
            }
        }
    }


运行程序, 观察控制台, 可能的一种结果


20200619172511616.png


发现,查询的票数是不对的,并且卖出的票数也是不对的。


一.二 加入同步


同步,可以分为两种,一种是同步代码块, 另外一种是同步方法, 用 synchronized 关键字进行修饰。


一.二.一 同步代码块


public static void main(String[] args) {
    //test5();
        test6();
    }
public static void test6(){
        //实例化两次
        MyRunnableDemo6 myRunnableDemo1=new MyRunnableDemo6();
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo1);
        Thread thread3=new Thread(myRunnableDemo1);
        //启动
        thread1.start();
        thread2.start();
        thread3.start();
    }
    static class MyRunnableDemo6 implements Runnable{
        private int ticket=5;
        @Override
        public void run() {
               for(int i=0;i<10;i++){
        // 进行同步, 同步的是当前对象  
                   synchronized (this){
                       if(ticket>0){
                           try {
                               Thread.sleep(1000);
                           } catch (InterruptedException e) {
                               e.printStackTrace();
                           }
                           System.out.println("还剩下:"+ticket+"张票");
                           ticket--;
                    }
                 }
           }
        }
    }


运行程序,控制台打印输出


20200619172522752.png


查询的票数是对的,卖出的票数也是对的。


一.二.二 同步方法


public static void main(String[] args) {
    //test5();
       // test6();
    test7();
    }
    public static void test7(){
        //实例化两次
        MyRunnableDemo7 myRunnableDemo1=new MyRunnableDemo7();
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo1);
        Thread thread3=new Thread(myRunnableDemo1);
        //启动
        thread1.start();
        thread2.start();
        thread3.start();
    }
    static class MyRunnableDemo7 implements Runnable{
        private int ticket=5;
        @Override
        public void run() {
      //调用同步方法
            pay();
        }
    //同步方法
        public synchronized void pay(){
            for(int i=0;i<10;i++){
                if(ticket>0){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("还剩下:"+ticket+"张票");
                    ticket--;
                }
            }
        }
    }


运行程序,查看控制台信息


20200619172532119.png

相关文章
|
8月前
|
Linux
Linux线程同步(try锁和读写锁)
Linux线程同步(try锁和读写锁)
96 0
|
SQL 关系型数据库 MySQL
当出现mysql死锁的情况下,应该怎么确认是那个业务中的事务出现了死锁呢
当出现mysql死锁的情况下,应该怎么确认是那个业务中的事务出现了死锁呢
138 0
|
Linux API
【Linux线程同步专题】二、读写锁
【Linux线程同步专题】二、读写锁
198 0
|
关系型数据库 MySQL
Mysql 查看死锁,解除死锁的方法
Mysql 查看死锁,解除死锁的方法
325 0
|
安全
同步和死锁(三)下
同步和死锁(三)
142 0
同步和死锁(三)下
线程的同步
线程的同步
131 0
|
算法 调度 开发者
什么是死锁?如何解决死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
|
Java
互斥同步-锁
synchronized原理。 对象头与Monitor结构。 锁优化技术:锁粗化、锁消除、自旋与适应性自旋、偏向锁、轻量级锁
1476 0

相关实验场景

更多