摘要: 如果线程A将对象X置入某个线程安全器,随后线程B重新获得X,这时可以保证B看到的X的状态,一定正是A设置的。 为了安全的发布对象,对象的引用以及对象的状态必须同时对其他线程可见。 1、通过静态初始化器初始化对象的引用; 2、将它的引用存储到volatile域活AtomicReference; 3、将它的引用存储到正确创建的对象的final域中; 4、将它的引用存储到由锁正确保护的域中。 以下情况符合安全发布: 1、置入Hashtable、synchronizedMap、ConcurrentMap中的主键以及键值,会安全地发布到可以从Map获得它们的任意线程中,无论是直... 阅读全文
posted @ 2011-09-15 18:18 k3huihui 阅读(188) 评论(0) 推荐(0)
摘要: 创建后状态不能被修改的对象叫做不可变对象。不可变对象天生就是线程安全的,可以放心的共享与发布,不需要创建防御性拷贝。 可变对象传递给不可信的代码,或者将它发布到不可信代码可以找到的地方,都是危险的,有可能被改变状态或者会保留引用并在其他线程中修改状态。 不可变性并不简单地等于将对象中的所有域都声明为final类型,所有域都是final类型的对象依旧可以是可变的,因为final域可以获得一个可变对象的引用。 阅读全文
posted @ 2011-09-15 18:02 k3huihui 阅读(296) 评论(0) 推荐(0)
摘要: 栈限制(也称线程内部或者线程本地用法)是线程限制的一种特例,在栈限制中,只能通过本地变量才可以触及对象。正如封装使不变约束更容易被保持,本地变量使对象更容易被限制在线程本地中。本地变量本身就被限制在执行线程中;它们存在于执行线程栈。其他线程无法访问这个栈。public int loadTheArk(Collection<Animal> candidates) { SortedSet<Animal> animals; int numPairs = 0; Animal candidate = null; // animals被限制在方法中,不要让它们溢出 an... 阅读全文
posted @ 2011-09-15 17:54 k3huihui 阅读(931) 评论(0) 推荐(0)