并发编程(十)----synchronized(1)

本文介绍了Java并发编程中的synchronized关键字,它用于保证线程安全,确保同一时刻只有一个线程执行特定代码。文章还讨论了synchronized可能导致的死锁问题,分析了当多个线程以不同顺序请求相同锁时发生死锁的场景。
摘要由CSDN通过智能技术生成

synchronized作用

在并发编程中存在线程安全问题,主要原因有:

  • 1.存在共享数据;
  • 2.多线程共同操作共享数据;
    关键字synchronized可以保证同一时刻,只有一个线程可以执行某个方法或者代码块,实现线程安全。

synchronized使用方式

分类具体分类被锁的对象伪代码
方法实例方法类的实例对象public synchronized void method(){}
静态方法类对象public static synchronized void method(){}
代码块实例对象类的实例对象 synchronized(this){}
class对象类对象 synchronized(Object.class){}
任意实例对象实例对象ObjectString lock = "lock"; synchronized(lock){}
如果锁的是对象的话,尽管new多个对象,但他们仍然属于同一个类依然会被锁住,即线程之间保持同步关系。

synchronized导致死锁

死锁是两个或多个线程阻塞着等待其他处于死锁状态的线程所持有的锁。
通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。
例如线程1锁住了A,同时尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A加锁,此时死锁就发生了。

package com.hexy.thread.demo;

public class DeadLockDemo {
    public static void main(String[] args) {
        String A = "a";
        String B = "b";
        Thread thread1 = new Thread(() -> {
            synchronized (A) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (B) {
                    System.out.println("thread1 is over");
                }
            }
        });
        Thread thread2 = new Thread(() -> {
            synchronized (B) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (A) {
                    System.out.println("thread2 is over");
                }
            }
        });
        thread1.start();
        thread2.start();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值