并发编程-看完这篇,所有Java并发编程的问题你都能应对自如

本文详细介绍了Java并发编程的关键概念,包括synchronized修饰普通方法和静态方法的区别,类锁和对象锁的区分,以及可见性的含义。接着探讨了锁的类型,CAS无锁编程原理,ReentrantLock的实现,AQS核心原理。同时讨论了synchronized的优化,如逃逸分析和锁消除。此外,文章还涵盖了volatile的作用,与synchronized的区别,线程的生命周期,ThreadLocal的工作原理,线程池的基本原理,以及如何确保多个线程按顺序执行的方法。
摘要由CSDN通过智能技术生成

1、synchronized修饰普通方法和静态方法的区别?什么是可见性?

对象锁是用于对象实例方法,或者一个对象实例上的, 类锁 是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。

但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,类锁其实锁的是每个类的对应的class对象。类锁和对象锁之间也是互不干扰的。

对象锁:

/**
* 对象锁 synchronized修饰普通方法 锁的是当前类实例对象
*/
public synchronized void syncMethod1() {
    //do working...
}
复制代码
private final Object o = new Object();

/**
* 对象锁 锁的是Object对象实例
*/
public void syncMethod2() {
    synchronized (o) {
        //do working...
    }
}
复制代码

类锁:

/**
* 类锁 synchronized修饰静态方法 锁的是当前类唯一的.class对象,也就是SynchronizedType.class,等同于下面的syncMethod3()
*/
public static synchronized void syncMethod3() {
    //do working...
}
复制代码
/**
* 类锁 锁的是当前类唯一的.class对象。
*/
public void syncMethod4() {
    synchronized (SynchronizedType.class) {
        //do working...
    }
}
复制代码

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

由于线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量,那么对于共享变量V,它们首先是在自己的工作内存,之后再同步到主内存。可是并不会及时的刷到主存中,而是会有一定时间差。很明显,这个时候线程A对变量V的操作对于线程B而言就不具备可见性了 。

要解决共享对象可见性这个问题,我们可以使用 volatile 关键字或者是加锁。

2、锁分哪几类?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值