本篇内容介绍了“Java多线程之锁怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
首先强调一点:Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁。同时,类锁也是对象锁,类是Class对象
Java8锁
核心思想
关键字在实例方法上,锁为当前实例
关键字在静态方法上,锁为当前Class对象
关键字在代码块上,锁为括号里面的对象
在进行线程执行顺序的时候,如果添加了线程睡眠,那么就要看锁的对象是谁,同一把锁 / 非同一把锁是不一样的
Synchronized
synchronized 是Java提供的关键字,用来保证原子性的
synchronized的作用域如下
作用在普通方法上,此方法为原子方法:也就是说同一个时刻只有一个线程可以进入,其他线程必须在方法外等待,此时锁是对象
作用在静态方法上,此方法为原子方法:也就是说同一个时刻只有一个线程可以进入,其他线程必须在方法外等待,此时锁是当前的Class对象
作用在代码块上,此代码块是原子操作:也就是说同一个时刻只有线程可以进入,其他线程必须在方法外等待,锁是 synchronized(XXX) 里面的 XXX
先看一段简单的代码
public class SynchronizedTest {
public static void main(String[] args) {
test1();
test2();
}
// 使用synchronized修饰的方法
public synchronized static void test1() {
System.out.println("SynchronizedTest.test1");
}
// 使用synchronized修饰的代码块
public static void test2() {
synchronized (SynchronizedTest.class) {
System.out.println("SynchronizedTest.test2");
}
}
}
执行之后,对其进行执行javap -v命令反编译
// 省略
版权声明:除特别声明外,本站所有文章皆是本站原创,转载请以超链接形式注明出处!