天天看点

初涉java多线程(一)

十一期间看了一点java多线程,现在又回顾了一下。看书-->论坛-->看书 算是一个很好的学习步骤。把理解的DD写下来就理解的更实在了。

代码运行后,根本看不到0000000007输出在控制值或命令行;而是001与002交替输出:synchronized 并不是锁住代码块or方法,否则只有一个一直输出。

t与tt是不同的对象,他们之间没有什么线程安全问题。

t1.start(); 由于调用了printInfo()同步方法,t对象关联的锁被线程一所得,无限循环的输出(运行)导致的结果是,线程一在程序运行期间不会释放t对象的锁;所以27行启动线程三后会一直阻塞于39行,因为线程一、三访问的是同一对象,线程一不释放锁,39行中线程三觊觎这把锁,只能阻塞了。

有人会问35行怎么能执行?这里只是把对象引用指向堆中对象,并没有访问对象(给对象传消息),所以35行能执行。(传递的是对象引用的拷贝)

倘若把第7行的synchronized去掉,那么就能看到0000000007输出在控制值或命令行;此时线程三并未顺利执行,线程三只是执行了39行,阻塞于40行;因为setInfo不是同步方法了,调用此方法时,线程不需要得到对象的关联锁;而40行调用printInfo()同步方法时,只能阻塞了:线程一还没有释放此对象的锁...

第7、10行的两个同步方法可写成下面的形式:

synchronized(this)是不是很形象了:对象要调用本方法,就锁住此对象。