锁定老帖子 主题:java线程安全总结
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-18
受益匪浅,感谢
|
|
返回顶楼 | |
发表时间:2011-07-18
volatile的理解。
线程的有序性和内存可见性。 分析的很不错。 |
|
返回顶楼 | |
发表时间:2011-09-23
lz帖子里面讲的“有序性”不对啊,似乎想说happens-before,但是又不是说的happens-before,你这儿的“有序性”是“原子性”的意思吧?
volatile能够保证可见性,还能保证happens-before,这点似乎在帖子里面没有谈到。 |
|
返回顶楼 | |
发表时间:2011-09-23
AlwenS 写道 总得来说不错。
但,没引入happen-before模型,对jdk1.5之后,对volatile,final等关键字的语义的解释,以及对并发有序性的理解,有些偏差。建议参考jsr133。 我猜这是大多数人投隐藏的原因。 是的,换我也投隐藏,现在没机会了,因为里面对volatile的解释是不对的。 |
|
返回顶楼 | |
发表时间:2011-10-15
请问LZ,是不是在方法内部申明的变量都是线程安全的?
|
|
返回顶楼 | |
发表时间:2011-10-19
谢谢ZL 看了这篇文章 受益了
|
|
返回顶楼 | |
发表时间:2011-10-28
楼主你好,按照你的代码,我也写了一个类,只不过有点小小的变动,为什么没有添加同步方法,执行结果却总是正确的,没有像你的结果那样是变化的。这个是怎么回事?
public class Account { private int balance; public int getBalance() { return balance; } public Account( int balance ) { this.balance = balance; } public void add( int amount ) { System.out.println( "add:" + amount ); balance += amount; } public void withdraw( int amount ) { System.out.println( "withdraw:" + amount ); balance -= amount; } public static void main( String[] args ) { try { Account account = new Account( 100 ); TransferUnit tuAdd = new TransferUnit( TransferUnit.ADD, 10 ); TransferUnit tuWithDraw = new TransferUnit( TransferUnit.WITHDRAW, 10 ); Transfer transferAdd = new Transfer( account, tuAdd ); Transfer transferWD = new Transfer( account, tuWithDraw ); Thread tAdd = new Thread( transferAdd, "add" ); Thread tWD = new Thread( transferWD, "withdraw" ); tAdd.start(); tWD.start(); tAdd.join(); tWD.join(); System.out.println( "result:" + account.getBalance() ); } catch ( InterruptedException e ) { e.printStackTrace(); } } } class Transfer implements Runnable { private Account account; private TransferUnit transferUnit; public Transfer( Account account,TransferUnit transferUnit ) { this.account = account; this.transferUnit = transferUnit; } public Account getAccount() { return account; } public TransferUnit getTransferUnit() { return transferUnit; } public void run() { for ( int i = 0; i < 10000; i++ ) { switch ( transferUnit.getTransferType() ) { case TransferUnit.ADD: account.add( transferUnit.getAmount() ); break; case TransferUnit.WITHDRAW: account.withdraw( transferUnit.getAmount() ); break; } try { Thread.sleep( 2 ); } catch ( InterruptedException e ) { e.printStackTrace(); } } } } class TransferUnit { public static final int ADD = 1; public static final int WITHDRAW = 2; private int transferType; private int amount; public TransferUnit( int transferType,int amount ) { this.transferType = transferType; this.amount = amount; } public int getAmount() { return amount; } public int getTransferType() { return transferType; } } |
|
返回顶楼 | |
发表时间:2011-11-02
楼主的文章写的浅显易懂啊,受益匪浅
|
|
返回顶楼 | |
发表时间:2011-11-03
明天的昨天 写道 “必须同时满足下面两个条件:
1)对变量的写操作不依赖于当前值。 2)该变量没有包含在具有其他变量的不变式中 ” 语言比较晦涩,最好有例子说明。。。 同求~ |
|
返回顶楼 | |
发表时间:2011-11-03
这是我看过最好的多线程入门教程了。 消化下, 再找你的别的帖子看。
谢谢你啊 , 无私啊! |
|
返回顶楼 | |