`
okey9
  • 浏览: 16513 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

synchronized 使用注意事项

 
阅读更多

 

在使用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关键字定义的静态方法。这有点象数据表中的表锁,当修改一条记录时,系统就将整个表都锁住了,因此,大量使用这种同步方式会使程序的性能大幅度下降。

 

分享到:
评论

相关推荐

    java里面synchronized用法.doc

    五、synchronized 关键字的注意事项 1. 确定 synchronized 关键字取得的锁是对象,而不是代码块或函数。 2. 每个对象只有一个锁与之相关联。 3. 实现同步可能会产生系统开销,甚至可能造成死锁,因此应尽量避免无谓...

    Android synchronized 测试案例

    六、注意事项 - 尽量减少`synchronized`的使用,因为它会降低程序的并发性能。 - 避免死锁,合理设计同步代码块的执行顺序。 - 使用`synchronized`时,考虑使用更细粒度的锁,提高并发性。 通过这个测试案例,...

    正确使用多线程同步锁@synchronized()1

    本文将深入探讨`@synchronized`的工作原理、特点以及使用时需要注意的事项。 首先,`@synchronized`的原理是基于递归互斥锁(Recursive Mutex)。在Objective-C中,当你使用`@synchronized`块包围一段代码时,会为...

    JAVA注意事项

    在Java编程过程中,掌握一些关键的注意事项至关重要,这不仅能提高代码质量,还能避免常见的编程陷阱。以下是一些关于"JAVA注意事项"的详细说明: 1. **命名规范**:Java有严格的命名规则,类名应使用驼峰式命名,...

    java的线程同步机制synchronized关键字的理解_.docx

    synchronized 的使用注意事项 1. synchronized 方法可能会对系统性能产生影响, nên尽量避免无谓的同步掌握。 2. 使用 synchronized 关键字时,需要明确对象的锁是谁的。 3. synchronized 块可以作为一种解决方法...

    springboot中事务管理@Transactional的注意事项与使用场景

    SpringBoot 中事务管理 @Transactional 的注意事项与使用场景 在本篇文章中,我们将详细讲解 SpringBoot 中事务管理 @Transactional 的注意事项与使用场景,以帮助开发者更好地理解和使用 @Transactional 注解。 ...

    ReentrantLock 与 synchronized 简介

    4. **注意事项**: - 使用`ReentrantLock`时,必须显式地在`finally`块中释放锁,以防止由于异常而导致的锁未释放问题。 - `ReentrantLock`支持重入特性,即允许同一个线程多次获取同一把锁,这与`synchronized`的...

    javasynchronized详解.pdf

    6. **注意事项**: - 锁的使用应谨慎,过度使用`synchronized`可能导致死锁、饥饿或性能下降。应尽量减小同步代码的范围,只同步必要的部分。 - `synchronized`无法解决线程间的通讯问题,比如生产者消费者问题,...

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    synchronized 关键字的注意事项 在使用 synchronized 关键字时,需要注意以下几点: * synchronized 关键字只能被一个线程获取,没有获得锁的线程只能等待。 * 每个实例都对应有自己的锁(this),不同实例之间...

    Javasynchronized机制.pdf

    4. **注意事项**: - 同步机制虽然提供了线程安全,但也会带来性能开销,因为它可能导致线程阻塞,所以在不需要同步的情况下应避免使用。 - 死锁是多线程编程中的常见问题,使用`synchronized`不当可能会导致死锁...

    Java使用volatile关键字的注意事项

    **使用`volatile`的注意事项:** 1. **运算结果不依赖当前值**:如果你的变量只被用来作为状态标志,比如一个布尔值`flag`,并且它的赋值操作不依赖于其当前值,那么可以使用`volatile`。例如,`flag = true`或`...

    第十一节 多线程的使用与注意事项.docx

    在iOS开发中,多线程的使用是提升应用程序性能和用户体验的重要手段。本文将详细介绍如何在iPhone SDK中使用多线程以及需要注意的关键点。...了解其工作原理和注意事项对于iOS开发者来说是必不可少的。

    Java多线程基础-02、数组定义方式一、访问、注意事项.rar

    本教程将深入讲解Java多线程的基础知识,重点关注数组的定义方式、访问方法以及在多线程环境下的注意事项。数组是Java中最基本的数据结构之一,理解如何在多线程环境下正确地操作数组对于编写高效、安全的代码至关...

    JAVA多线程的使用场景与注意事项总结

    JAVA多线程的使用场景与注意事项总结 Java多线程是Java语言中的一种重要机制,允许程序同时执行多个任务,以提高程序的执行效率和响应速度。在Java中,多线程可以通过继承Thread类、实现Runnable接口或使用线程池来...

    JAVA面试体系一条龙(含笔试与各种注意事项与标准模板)

    "JAVA面试体系一条龙(含笔试与各种注意事项与标准模板)"这个资源显然旨在帮助求职者全面准备Java面试,涵盖笔试环节以及面试的各种策略和技巧。 一、Java基础知识 在Java面试中,基础扎实是必不可少的。这包括但...

    JAVA面试题 简谈你对synchronized关键字的理解

    下面我们将详细介绍synchronized关键字的特性、用法和注意事项。 Synchronized关键字的特性 1. 可以用来修饰方法:synchronized可以用来修饰实例方法和静态方法,以实现线程安全。 2. 可以用来修饰代码块:...

    java单例模式使用及注意事项

    5. 使用时的注意事项: - **反射攻击**:恶意代码可以通过反射创建新的实例,破坏单例,因此在设计时需要考虑反射的安全性,可以添加检查机制或者使用枚举类型实现单例。 - **线程安全**:懒汉式单例在多线程环境...

    java面试宝典 吐血推荐,很全面

    - **注意事项**: 使用`break`时,需要为外层循环添加标签,如`outerLoop:`,然后使用`break outerLoop;`来跳出多层循环。 **5. switch语句能否作用在byte上,能否作用在long上,能否作用在String上?** - **知识点*...

    Java中synchronized关键字修饰方法同步的用法详解

    5. 注意事项: - 同步方法或同步块可以避免数据不一致性的问题,但也会带来性能开销,因为它会导致线程阻塞,降低并发效率。 - 使用synchronized时,需谨慎处理死锁和活锁的问题,避免造成线程长时间等待。 - ...

    基于Java的网购系统设计与开发的注意事项.zip

    在开发基于Java的网购系统时,有很多...以上是基于Java的网购系统设计与开发的主要注意事项,这些知识点的掌握和应用对于构建高质量的电商系统至关重要。在实际项目中,还需要根据具体需求和业务场景进行调整和优化。

Global site tag (gtag.js) - Google Analytics