线程安全问题实际上来源于两个线程同时存取单一对象的数据。
线程同步机制
同步块
给共享资源上锁,关键字: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关键字才可以。
网友评论