Java线程安全问题

线程安全问题实际上来源于两个线程同时存取单一对象的数据。

线程同步机制

同步块

给共享资源上锁,关键字:synchronized,设置在共享资源中

  synchronized(Object){
  }

通常将共享资源操作放在这个代码块内。当其他线程也获取到这个锁的时候,必须等待锁被释放时才能进入该区域,Object可以是一个类,此时相当于修饰了一个类,不填可以指定为空字符串 " "。

同步非静态方法(同步对象的方法)

Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,public synchronized void method(){//todo}; synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来的范围,而修饰方法范围是整个函数。

同步静态方法(同步类的所有对象的方法)

Synchronized也可修饰一个静态方法,用法如下:

  public synchronized static void method() {
     // todo }

我们知道静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是这个类的所有对象。

继承问题

synchronized关键字不能继承。
虽然可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继承。如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized关键字才可以。

你可能感兴趣的:(Java线程安全问题)