学习笔记之synchronized
学习笔记之synchronized
ynchronized是一个JDK提供的同步的关键字,通过synchronized可以锁定一个代码块或者一个方法,从而实现锁的效果。
synchronized的几种用法
1.修饰在对象方法上
public class SynDemo {
int i = 0;
int x = 0;
public synchronized void testSync() {
i++;
x++;
}
}
放在方法上,锁的是SynDemo的实例对象。这里要弄清楚实例对象,简单的来说就是假如A和B是SynDemo的实例对象,那么A和B对不同的实例对象,所以A和B不形成互异关系。
2.在静态方法上:
public class SynDemo {
static int value = 0;
public synchronized static void testStaticSync() {
value++;
}
}
修饰在静态方法上的时候,锁的是这个类对应的类对象,也就是SyncDemo.class对象。再举个例子,假如A和B是SynDemo的实例对象,此时A和B形成互异关系。
3.在方法内部的同步代码快#
public class SynDemo {
int i = 0;
int x = 0;
Object lockObj = new Object();
public void testInnerSync() {
synchronized(lockObj) {
i++;
x++;
}
}
}
使用synchronized关键字需要注意什么
其实synchronized是对一个对象上锁的,使用的时候需要注意在对同一个对象上锁才能达到互斥的目的。
(1)定义一个TestThread类,继承自Thread
(2)TestThread的内部持有一个SycDemo对象
(3)TestThread的run方法内部调用SyncDemo对象的testSync方法执行synchronized修饰的同步方法。
public class SynDemo {
int i = 0;
int x = 0; // 争抢对象SyncDemo的锁
public synchronized void testSync() {
i++;
x++;
}
static class TestThread extends Thread {
SynDemo lock;
TestThread(SynDemo lock) {
this.lock = lock;
}
@Override
public void run() {
lock.testSync();
}
}
public static void main(String[] args) { // 锁对象lock1
SynDemo lock1 = new SynDemo(); // 锁对象lock2
SynDemo lock2 = new SynDemo();
TestThread threadA = new TestThread(lock1);
TestThread threadB = new TestThread(lock2);
threadA.start();
threadB.start();
}
}
像这种方式,threadA和threadB是达不到互斥的目的的,因为threadA锁住的是lock1对象;然而thread锁住的是lock2对象。完全争抢的不是同一个锁。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)