《Java并发编程实战》3.3.1章出现了一个词:Ad-hoc
翻译非常难懂:
Ad-hoc线程封闭是指,维护线程封闭性的职责完全由程序实现来承担。Ad-hoc线程封闭是非常脆弱的,因为没有任何一种 语言特性,例如可见性修饰符或局部变量,能将对象封闭到目标线程上。事实上,对线程封闭对象(例如,GUI应用程序中的可视化组件或数据模型等)的引用通常保存在公有变量中。
我的理解:
Ad-hoc翻译为特定的。
如何理解 Ad-hoc线程封闭?
1.首先什么是线程封闭性?
答:仅在单线程内访问数据,就不需要同步。这种技术被称为线程封闭
2.如何维护线程封闭性?
答:保证对象的使用被限制在单线程中。
3.维护线程封闭性的职责完全由程序实现来承担
答:程序员自己写代码把对象限制在单个线程上。
国外的网站几乎都像复读机似的重复这句话:
程序员自己负责把对象限制在(目标)线程上。
看到这里我还是一头雾水,程序员自己去实现,能否举一个例子?
我搜到一个国外网站stackoverflow的例子
The most ad-hoc way of thread confiment is by simply saying/documenting in a plain language (like English) to other programmers that they should not access a specific object.
大多数"特定"方式是简单地以通俗易懂的语言(例如英语)对其他程序员说/记录他们不应该访问特定的对象。
So an example could be as simple as documenting something like this:
一个简单的例子就是记录这样的东西
// Don't use this object in other threads than Thread X
//不要在线程X之外的其他线程中使用该对象
private SomeType someObject;
public SomeType getSomeObject() {
return someObject; }
or
// Don't modify this from any other thread than Thread X.
//除线程X之外,不要从其他任何线程修改此内容
// So use it read-only for those other threads.
//以只读方式用于其他线程。
private volatile int someNumber;
总结一下:通过写注释等其它方式,告诉自己或者其他开发人员,不应该在别的线程访问特定的对象。应该算是一种约定。所以本书作者才说:Ad-hoc线程封闭是非常脆弱的,毕竟连语法特性都没用上。
我看了Ad-hoc只在本书这一页出现,说白了直接跳过也不影响书后面的阅读。而且书中提到,这种方式非常不推荐使用,推荐使用栈封闭和ThreadLocal类
🤮