线程和锁2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/hardtomakeaname/article/details/102744348

一.synchronized和Lock:

synchronized:有一个共享资源,我们只允许一次一个线程访问它。把所有能访问该资源的方法都封装到一个类中,然后把这些方法全都加上synchronized关键字,如果这时候有一个线程正在调用一个该关键字标记的方法,那么当这个线程从该方法返回之前,其他所有要调用该关键字所标记的方法的线程都会被阻塞。

 

https://www.jianshu.com/p/b1581c35c881    //这个网址讲锁讲的特别好

lock:

synchronied和lock的比较:

再解决以后

synchronized的缺陷:

  有两种情况可以让一个执行synchronized修饰的方法的线程退出,一是执行完毕,二是线程执行发生异常,JVM会让线程自动释放锁。。。。。。所以如果这个线程由于等待IO或者其他情况(比如sleep方法)被阻塞而又没有释放锁,那么其他想操作这个锁的线层就要一直等下去。  再比如“读操作”,这个操作是可以多个线程同时执行的。你synchronized关键字就做不到,Lock可以

Lock必须手动释放,否则容易造成死锁,而synchronized关键字不需要手动释放,执行完他自己就释放了

Lock是个接口 而synchronized是java内置的关键字

通过Lock可以获取有没有获得锁,而synchronized则不能

Lock可以提高多个线程获得锁的效率

 

二.线程的五大状态:

1.新建

2.就绪

3.运行

4.阻塞

5.死亡

三:java当中的死锁举例:

public class DeadLockTest
{
    private static Object A = new Object(), B = new Object();

    public static void main(String[] args)
    {
        new Thread(() -> {
            System.out.println("线程1开始执行...");
            synchronized (A)
            {
                try
                {
                    System.out.println("线程1拿到A锁");
                    //休眠两秒让线程2有时间拿到B锁
                    Thread.sleep(2000);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
                synchronized (B)
                {
                    System.out.println("线程1拿到B锁");
                }
            }
        }).start();
        
        new Thread(() -> {
            System.out.println("线程2开始执行...");
            synchronized (B)
            {
                try
                {
                    System.out.println("线程2拿到B锁");
                    //休眠两秒让线程1有时间拿到A锁
                    Thread.sleep(2000);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
                synchronized (A)
                {
                    System.out.println("线程2拿到A锁");
                }
            }
        }).start();
        
    }
}

猜你喜欢

转载自blog.csdn.net/hardtomakeaname/article/details/102744348