论坛首页 Java企业应用论坛

java线程安全总结

浏览 134481 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-07-18  
受益匪浅,感谢
0 请登录后投票
   发表时间:2011-07-18  
volatile的理解。
线程的有序性和内存可见性。
分析的很不错。
0 请登录后投票
   发表时间:2011-09-23  
lz帖子里面讲的“有序性”不对啊,似乎想说happens-before,但是又不是说的happens-before,你这儿的“有序性”是“原子性”的意思吧?
volatile能够保证可见性,还能保证happens-before,这点似乎在帖子里面没有谈到。
0 请登录后投票
   发表时间:2011-09-23  
AlwenS 写道
总得来说不错。 

但,没引入happen-before模型,对jdk1.5之后,对volatile,final等关键字的语义的解释,以及对并发有序性的理解,有些偏差。建议参考jsr133。

我猜这是大多数人投隐藏的原因。

是的,换我也投隐藏,现在没机会了,因为里面对volatile的解释是不对的。
0 请登录后投票
   发表时间:2011-10-15  
请问LZ,是不是在方法内部申明的变量都是线程安全的?
0 请登录后投票
   发表时间:2011-10-19  
谢谢ZL 看了这篇文章 受益了
0 请登录后投票
   发表时间: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;
    }

}
0 请登录后投票
   发表时间:2011-11-02  
楼主的文章写的浅显易懂啊,受益匪浅
0 请登录后投票
   发表时间:2011-11-03  
明天的昨天 写道
“必须同时满足下面两个条件:
1)对变量的写操作不依赖于当前值。
2)该变量没有包含在具有其他变量的不变式中 ”

语言比较晦涩,最好有例子说明。。。


同求~
0 请登录后投票
   发表时间:2011-11-03  
这是我看过最好的多线程入门教程了。    消化下, 再找你的别的帖子看。


谢谢你啊 , 无私啊!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics