这个我会跟据大家的反馈,不断修改,迭代版本,做一个负责任有担当的博主,你们收藏与点赞就是博主坚持走下去的动力,我们一起加油,大家有什么不懂的可以评论区留言或者私聊博主!
synchronized关键字的用法
A. 普通方法
class Example {
public synchronized void method1() {
System.out.println("Method1 is executing");
}
public synchronized void method2() {
System.out.println("Method2 is executing");
}
}
- 同实例同方法:多个线程访问同一实例的同一个方法时,会排队。
- 例如,线程 A 和线程 B 同时调用
example.method1()
,线程 A 会先获得锁,线程 B 会被阻塞,直到线程 A 释放锁。
- 同实例不同方法:多个线程访问同一实例的不同方法时,不会排队。
- 例如,线程 A 调用
example.method1()
,线程 B 调用 example.method2()
,它们可以同时执行,因为它们锁定的是同一实例的不同方法。
- 不同实例同方法:不同实例的同一个方法可以并发执行。
- 例如,若有
Example example1 = new Example();
和 Example example2 = new Example();
,线程 A 调用 example1.method1()
,线程 B 调用 example2.method1()
,它们不会互相阻塞。
- 不同实例不同方法:不同实例的不同方法可以并发执行。
- 例如,线程 A 调用
example1.method1()
,线程 B 调用 example2.method2()
,它们可以同时执行。
B. 静态方法
class Example {
public static synchronized void staticMethod1() {
System.out.println("Static Method1 is executing");
}
public static synchronized void staticMethod2() {
System.out.println("Static Method2 is executing");
}
}
- 同实例同方法:多个线程访问同一个实例的同一个静态方法时,会排队。
- 例如,线程 A 和线程 B 同时调用
Example.staticMethod1()
,线程 A 会先获得锁,线程 B 会被阻塞。
- 同实例不同方法:多个线程访问同一个实例的不同静态方法时,会排队。
- 例如,线程 A 调用
Example.staticMethod1()
,线程 B 调用 Example.staticMethod2()
,它们会互相阻塞,因为它们都是静态方法,锁定的是类对象。
- 不同实例同方法:不同实例的同一个静态方法会排队。
- 例如,线程 A 调用
Example.staticMethod1()
,线程 B 调用 Example.staticMethod1()
,它们会互相阻塞,因为静态方法锁定的是类对象。
- 不同实例不同方法:不同实例的不同静态方法可以并发执行。
- 例如,线程 A 调用
Example.staticMethod1()
,线程 B 调用 Example.staticMethod2()
,它们可以同时执行。
C. 代码块
class Example {
public void method() {
System.out.println("Non-synchronized part");
synchronized (this) {
System.out.println("Synchronized block is executing");
}
System.out.println("After synchronized block");
}
}
- 只锁代码块一部分:使用
synchronized
锁定特定的代码块,而不是整个方法。
- 这样可以提高并发性,因为只有在执行特定代码块时才会获取锁,其他非同步代码不会被阻塞。
总结:
synchronized
关键字用于实现线程同步,以防止多个线程同时访问共享资源。- 普通方法和静态方法的锁定行为不同,影响线程的排队和执行。
- 使用代码块可以更灵活地控制锁的范围,提高程序的并发性能。