在使用synchronized关键字时有以下四点需要注意:
1. synchronized关键字不能继承。
虽然可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继承。如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了。这两种方式的例子代码如下:
在子类方法中加上synchronized关键字
class Parent {
public synchronized void method() {
}
}
class Child extends Parent {
public synchronized void method() {
}
}
在子类方法中调用父类的同步方法
class Parent {
public synchronized void method() {
}
}
class Child extends Parent {
public void method() {
super.method();
}
}
2. 在定义接口方法时不能使用synchronized关键字。
3. 构造方法不能使用synchronized关键字,但可以使用下节要讨论的synchronized块来进行同步。
4. synchronized可以自由放置。
在前面的例子中使用都是将synchronized关键字放在方法的返回类型前面。但这并不是synchronized可放置唯一位置。在非静态方法中,synchronized还可以放在方法定义的最前面,在静态方法中,synchronized可以放在static的前面,代码如下:
public synchronized void method();
synchronized public void method();
public static synchronized void method();
public synchronized static void method();
synchronized public static void method();
但要注意,synchronized不能放在方法返回类型的后面,如下面的代码是错误的:
public void synchronized method();
public static void synchronized method();
synchronized关键字只能用来同步方法,不能用来同步类变量,如下面的代码也是错误的。
public synchronized int n = 0;
public static synchronized int n = 0;
public class MyThread1 extends Thread {
public String methodName;
public static void method(String s) {
System.out.println(s);
while (true);
}
public synchronized void method1() {
method("synchronized method1");
}
public synchronized void method2() {
method("synchronized method2");
}
public static synchronized void method3() {
method("static synchronized method3");
}
public static synchronized void method4() {
method("static synchronized method4");
}
public void run() {
try {
getClass().getMethod(methodName).invoke(this);
} catch (Exception e) {
}
}
public static void main(String[] args) throws Exception {
MyThread1 myThread1 = new MyThread1();
for (int i = 1; i <= 4; i++) {
myThread1.methodName = "method" + String.valueOf(i);
new Thread(myThread1).start();
sleep(100);
}
}
}
虽然使用synchronized关键字同步方法是最安全的同步方式,但大量使用synchronized关键字会造成不必要的资源消耗以及性能损失。虽然从表面上看synchronized锁定的是一个方法,但实际上synchronized锁定的是一个类。也就是说,如果在非静态方法method1和method2定义时都使用了synchronized,在method1未执行完之前,method2是不能执行的。静态方法和非静态方法的情况类似。但静态和非静态方法不会互相影响。看看如下的代码:
运行结果如下:
synchronized method1
static synchronized method3
从上面的运行结果可以看出,method2和method4在method1和method3未结束之前不能运行。
因此,我们可以得出一个结论,如果在类中使用synchronized关键字来定义非静态方法,那将影响这个中的所有使用synchronized关键字定义的非静态方法。如果定义的是静态方法,那么将影响类中所有使用synchronized关键字定义的静态方法。这有点象数据表中的表锁,当修改一条记录时,系统就将整个表都锁住了,因此,大量使用这种同步方式会使程序的性能大幅度下降。
分享到:
相关推荐
五、synchronized 关键字的注意事项 1. 确定 synchronized 关键字取得的锁是对象,而不是代码块或函数。 2. 每个对象只有一个锁与之相关联。 3. 实现同步可能会产生系统开销,甚至可能造成死锁,因此应尽量避免无谓...
六、注意事项 - 尽量减少`synchronized`的使用,因为它会降低程序的并发性能。 - 避免死锁,合理设计同步代码块的执行顺序。 - 使用`synchronized`时,考虑使用更细粒度的锁,提高并发性。 通过这个测试案例,...
本文将深入探讨`@synchronized`的工作原理、特点以及使用时需要注意的事项。 首先,`@synchronized`的原理是基于递归互斥锁(Recursive Mutex)。在Objective-C中,当你使用`@synchronized`块包围一段代码时,会为...
在Java编程过程中,掌握一些关键的注意事项至关重要,这不仅能提高代码质量,还能避免常见的编程陷阱。以下是一些关于"JAVA注意事项"的详细说明: 1. **命名规范**:Java有严格的命名规则,类名应使用驼峰式命名,...
synchronized 的使用注意事项 1. synchronized 方法可能会对系统性能产生影响, nên尽量避免无谓的同步掌握。 2. 使用 synchronized 关键字时,需要明确对象的锁是谁的。 3. synchronized 块可以作为一种解决方法...
SpringBoot 中事务管理 @Transactional 的注意事项与使用场景 在本篇文章中,我们将详细讲解 SpringBoot 中事务管理 @Transactional 的注意事项与使用场景,以帮助开发者更好地理解和使用 @Transactional 注解。 ...
4. **注意事项**: - 使用`ReentrantLock`时,必须显式地在`finally`块中释放锁,以防止由于异常而导致的锁未释放问题。 - `ReentrantLock`支持重入特性,即允许同一个线程多次获取同一把锁,这与`synchronized`的...
6. **注意事项**: - 锁的使用应谨慎,过度使用`synchronized`可能导致死锁、饥饿或性能下降。应尽量减小同步代码的范围,只同步必要的部分。 - `synchronized`无法解决线程间的通讯问题,比如生产者消费者问题,...
synchronized 关键字的注意事项 在使用 synchronized 关键字时,需要注意以下几点: * synchronized 关键字只能被一个线程获取,没有获得锁的线程只能等待。 * 每个实例都对应有自己的锁(this),不同实例之间...
4. **注意事项**: - 同步机制虽然提供了线程安全,但也会带来性能开销,因为它可能导致线程阻塞,所以在不需要同步的情况下应避免使用。 - 死锁是多线程编程中的常见问题,使用`synchronized`不当可能会导致死锁...
**使用`volatile`的注意事项:** 1. **运算结果不依赖当前值**:如果你的变量只被用来作为状态标志,比如一个布尔值`flag`,并且它的赋值操作不依赖于其当前值,那么可以使用`volatile`。例如,`flag = true`或`...
在iOS开发中,多线程的使用是提升应用程序性能和用户体验的重要手段。本文将详细介绍如何在iPhone SDK中使用多线程以及需要注意的关键点。...了解其工作原理和注意事项对于iOS开发者来说是必不可少的。
本教程将深入讲解Java多线程的基础知识,重点关注数组的定义方式、访问方法以及在多线程环境下的注意事项。数组是Java中最基本的数据结构之一,理解如何在多线程环境下正确地操作数组对于编写高效、安全的代码至关...
JAVA多线程的使用场景与注意事项总结 Java多线程是Java语言中的一种重要机制,允许程序同时执行多个任务,以提高程序的执行效率和响应速度。在Java中,多线程可以通过继承Thread类、实现Runnable接口或使用线程池来...
"JAVA面试体系一条龙(含笔试与各种注意事项与标准模板)"这个资源显然旨在帮助求职者全面准备Java面试,涵盖笔试环节以及面试的各种策略和技巧。 一、Java基础知识 在Java面试中,基础扎实是必不可少的。这包括但...
下面我们将详细介绍synchronized关键字的特性、用法和注意事项。 Synchronized关键字的特性 1. 可以用来修饰方法:synchronized可以用来修饰实例方法和静态方法,以实现线程安全。 2. 可以用来修饰代码块:...
5. 使用时的注意事项: - **反射攻击**:恶意代码可以通过反射创建新的实例,破坏单例,因此在设计时需要考虑反射的安全性,可以添加检查机制或者使用枚举类型实现单例。 - **线程安全**:懒汉式单例在多线程环境...
- **注意事项**: 使用`break`时,需要为外层循环添加标签,如`outerLoop:`,然后使用`break outerLoop;`来跳出多层循环。 **5. switch语句能否作用在byte上,能否作用在long上,能否作用在String上?** - **知识点*...
5. 注意事项: - 同步方法或同步块可以避免数据不一致性的问题,但也会带来性能开销,因为它会导致线程阻塞,降低并发效率。 - 使用synchronized时,需谨慎处理死锁和活锁的问题,避免造成线程长时间等待。 - ...
在开发基于Java的网购系统时,有很多...以上是基于Java的网购系统设计与开发的主要注意事项,这些知识点的掌握和应用对于构建高质量的电商系统至关重要。在实际项目中,还需要根据具体需求和业务场景进行调整和优化。