synchronizedsynchronized的用法锁定静态方法/** * 在静态方法上添加 */ public static synchronized void test1() { }锁定当前类的class对象锁定普通方法/** * 在普通方法上添加 */ public synchronized void test2() { }锁定当前对象锁定class对象/*
synchronized
synchronized的用法
- 锁定静态方法
/**
* 在静态方法上添加
*/
public static synchronized void test1() {
}
锁定当前类的class对象
- 锁定普通方法
/**
* 在普通方法上添加
*/
public synchronized void test2() {
}
锁定当前对象
- 锁定class对象
/**
* 锁定class对象
*/
public static void test3() {
// 锁定class对象
synchronized (SynchronizedDemo.class) {
}
}
锁定指定的class对象
- 锁定不同对象
SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
/**
* 锁定普通对象
*/
public void test4() {
// 锁定class对象
synchronized (synchronizedDemo) {
}
}
锁定指定的对象
这就是synchronized关键字的四种用法,synchronized锁的标志保存在对象的对象头中
Lock
public class LockDemo {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
lock(lock);
}
public static void lock(Lock lock) {
lock.lock();
try {
System.out.println("执行业务逻辑");
} finally {
lock.unlock();
}
}
}
lock是基于AQS来实现的,在AQS中维护了一个双向链表,通过这个链表来保存竞争锁的线程,以此来实现竞争锁的资源等待获取锁,当获取锁的线程释放锁的时候,便会唤醒等待的线程去竞争锁。
延伸阅读:
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 931614094@qq.com 举报,一经查实,本站将立刻删除。