虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。 一、什么
1、关键字 private
class Sundae {
private Sundae() {}
static Sundae makeASundae() {
return new Sundae();
}
}
public class IceCream {
public static void main(String[] args) {
//!Sundae sundae = new Sundae()// 构造器是“私有”的,不能这么访问
Sundae sundae = Sundae.makeASundae();
System.out.println(sundae);
}
}
这个例子向我们证明了使用private 的方便:有时可能想控制对象的创建方式,并防止有人直接访问一个特定的构建器 (或者所有构建器)。在上面的例子中,我们不可通过它的构建器创建一个Sundae 对象;相反, 必须调用makeASundae()方法来实现(注释③)。
③:此时还会产生另一个影响:由于默认构建器是唯一获得定义的,而且它的属性是private,所以可防止
对这个类的继承。
2、关键字 protected
public class Cookie {
public Cookie() {
System.out.println("Cookie construct");
}
void foo() {
System.out.println("foo");
}
}
public class ChocolateChip extends Cookie{
public ChocolateChip() {
System.out.println("ChocolateChip constructor");
}
public static void main(String[] args) {
ChocolateChip x = new ChocolateChip();
//! x.foo();// 不能访问 foo
}
}
对于继承,值得注意的一件有趣的事情是倘若方法foo()存在于类Cookie 中,那么它也会存在于从Cookie继承的所有类中。当类Cookie和类ChocolateChip不在同一个包下时,不能访问foo()方法(同一个包下可以)。当然,亦可将其变成public。但这样一来,由于所有人都能自由访问它,所以可能并非我们所希望的局面。若象下面这样修改类Cookie:
public class Cookie {
public Cookie() {
System.out.println("Cookie construct");
}
protected void foo() {
System.out.println("foo");
}
}
将方法foo()的访问控制权限设置为 protected 时候,Cookie的子类就能在外部包访问foo()方法了。 x.foo(); 就不会报错了。 这个时候方法 foo() 方法并不是公开的(public)。
原文: http://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5