黑马程序员 – 学习Java5线程并发库(3) -- 2013.1.1

来源:互联网 发布:弱视治疗软件 编辑:程序博客网 时间:2024/05/24 11:13

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


昨天学习了线程的互斥与同步通信,今天学习了线程范围内的共享变量的概率。

嗯,新的一年到了,一定要好好学习JAVA!

 

当多个线程要访问同一个共享数据时,要注意线程的互斥(银行账户的例子,一个线程存,一个线程取,线程不互斥的话,账户上的金额就会出现问题),用同步代码块解决这类问题时,应该注意:

 

使用同步的前提

1. 必须要有两个或两个以上的线程

2. 必须是多个线程使用同一锁(监视器对象)。

 

同步代码块:

Synchronized( 监视器对象 )

{

         需要被同步的代码

}

 

Synchronized 关键加在函数上:

非静态函数用的锁是this,即调用函数的对象

静态函数用的锁是函数所在类的 .class文件。

 

同步通信时,张老师讲了一道面试题:子线程运行10次,主线程运行100次,接着子线程运行10次,主线程运行100次。如此循环往复50次。

张老师讲了一个重要的经验:要用到共同数据或共同算法的若干个方法,应该归在同一类中,这种设计正好体现了高类聚和程序的健壮性。这样的话,要添加新的同步线程,同步代码只需要在该类中添加即可,要修改同步的代码或算法,也是在该类中集中修改。

 

防止假唤醒的机制:用while而不是if

synchronized( object ) {

while(<condition does not hold>

         obj.wait(timeout);

         要同步的代码

}

 

线程范围内的共享变量:对于全局变量,每一个线程里对它的操作只在该线程范围内有效,不影响其它线程对它的操作。明天将继续学习ThreadLocal的应用。