美文网首页
线程的同步和死锁2

线程的同步和死锁2

作者: 秋笙fine | 来源:发表于2019-01-24 22:27 被阅读0次

本篇是为了同步处理操作。

通过观察可以发现,以上程序所带来的最大问题在:判断和修改数据是分开执行的,即某几个线程可以同时进行这些功能。

然而我们要实现卖票功能,判断和修改数据应该要由单个线程执行完,别的线程才能进行之后的操作,因而要加锁。

在Java里面如果想要实现线程同步,可以使用synchronized关键字来加锁。而这个关键字可以通过两种方式使用。

1.同步代码块(同步块必须锁定一个对象,一般就是锁当前对象)
2.同步方法

范例:观察同步块

package TestDemo;



class MyThread implements Runnable{//Runnable接口子类,也是线程公有对象,其实例化对象在堆中

    private int ticket=5;

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            synchronized(this){//当前操作每次只允许一个对象进入
            if(this.ticket>0){
                try {
                    Thread.sleep(100);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            
            System.out.println(Thread.currentThread().getName()+",sell ticket="+this.ticket--);
            
            }
        }
    }
    }   
}

public class TestDemo{
    
    public static void main(String[] args)throws Exception{
        MyThread mt=new MyThread();
    
        new Thread(mt,"seller A").start();
        new Thread(mt,"seller B").start();
        new Thread(mt,"seller C").start();
        new Thread(mt,"seller D").start();


    }
    
}

结果:


image.png

成功了。

范例:观察同步方法

package TestDemo;



class MyThread implements Runnable{//Runnable接口子类,也是线程公有对象,其实例化对象在堆中

    private int ticket=5;

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
                this.sale();//调用同步方法
            }
    }

    public synchronized void sale(){//同步方法
        if(this.ticket>0){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        
        System.out.println(Thread.currentThread().getName()+",sell ticket="+this.ticket--);
        
        }
    }

        
        
}

public class TestDemo{
    
    public static void main(String[] args)throws Exception{
        MyThread mt=new MyThread();
    
        new Thread(mt,"seller A").start();
        new Thread(mt,"seller B").start();
        new Thread(mt,"seller C").start();
        new Thread(mt,"seller D").start();


    }
    
}

结果:


image.png

也实现了。

中间件会帮我们实现一部分同步操作,没有的轮子可以自己写。同步操作与异步操作相比,异步操作的执行操作快,但是同步操作的线程安全性高。

相关文章

  • 线程的同步和死锁2

    本篇是为了同步处理操作。 通过观察可以发现,以上程序所带来的最大问题在:判断和修改数据是分开执行的,即某几个线程可...

  • GCD

    1、同步串行队列 2、同步并行队列 3、异步串行队列 4、异步并行队列 5、死锁 主线程中创建同步串行队列 主线程...

  • 并发 :线程间同步、锁、可重入锁及互斥锁

    线程间同步 线程间同步涉及线程互斥锁; 锁(Lock)容易导致死锁,可重入锁(RLock)则不会导致死锁,但每次 ...

  • 线程同步和线程死锁

    1.线程同步,一个关键字:synchronized 为什么有这个东西呢,假如有一个对象,里面有成员变量和方法,如果...

  • 死锁现象及分析方法 之二 Window Java

    1 死锁 当多条线程以不同的顺序抢占同步资源的时候,就有可能发生死锁。 2 示例 如下图所示,线程1持有锁对象A而...

  • GCD分析(中)

    同步函数死锁 死锁现象 主线程因为同步函数的原因等着先执⾏任务 主队列等着主线程的任务执⾏完毕再执⾏⾃⼰的任务 主...

  • GCD学习总结

    串行同步会造成死锁 执行顺序 :1 5 2 4 3 异步不阻塞线程

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

  • 关于主线程执行同步任务造成死锁的思考

    经典问题重现 bug 粘贴主线程+同步造成死锁 要想明白,为什么造成死锁,首先要搞懂主线程是干嘛的 主线程程序运行...

  • IOS开发-主线程同步执行死锁问题

    用过GCD的朋友都知道,直接调用主线程同步执行会死锁,那主线程同步执行创建出来有什么用?代码如下:主线程和主队列的...

网友评论

      本文标题:线程的同步和死锁2

      本文链接:https://www.haomeiwen.com/subject/wveujqtx.html