十一期间看了一点java多线程,现在又回顾了一下。看书-->论坛-->看书 算是一个很好的学习步骤。把理解的DD写下来就理解的更实在了。
public class TestThread implements Runnable{
private String info;
public TestThread(){}
public TestThread(String s){
this.info=s;
}
public synchronized void setInfo(String s){
this.info=s;
}
public synchronized void printInfo(){
while (true) {
System.out.println("print info..." + info);
}
}
public void run(){
printInfo();
}
public static void main(String[] args) {
TestThread t=new TestThread("001");
Thread t1=new Thread(t); //thread one
TestThread tt=new TestThread("002");
Thread t2=new Thread(tt); //thread two
Thread t3=new Thread(new TestClass(t));//thread three
t1.start();
t2.start();
t3.start(); //never execute, cause the object of t is locked in thread t1
}
}
class TestClass implements Runnable{
private TestThread tt;
public TestClass(TestThread tt){
this.tt=tt;
System.out.println("get iiiiiiiiiiiiit...");//can execute
}
public void run(){
tt.setInfo("0000000007");//blocked
tt.printInfo();
}
}
代码运行后,根本看不到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行的两个同步方法可写成下面的形式:
public void setInfo(String s){
synchronized(this){
this.info=s;
}
}
public void printInfo(){
synchronized(this){
while(true){
System.out.println("print info..."+info);
}
}
}
synchronized(this)是不是很形象了:对象要调用本方法,就锁住此对象。
分享到:
相关推荐
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。这份"java笔记与java核心内容解读"集合了网上广泛讨论的Java知识,旨在...无论你是初涉Java的新手还是寻求进阶的开发者,都能从中受益匪浅。
总的来说,《俄罗斯方块JAVA版》项目不仅是一个有趣的游戏,也是一个学习JAVA多线程编程和游戏开发的实战案例。开发者可以从中学习到如何利用JAVA的并发特性来构建实时系统,以及如何通过对象和类的设计实现复杂逻辑...
总的来说,《Java编程精选集锦》是一本全面且实用的Java学习资料,无论你是初涉Java编程的新手,还是寻求进阶的开发者,都能从中受益。通过深入阅读和实践,你将能够熟练掌握Java编程,并具备在J2EE平台上构建复杂...
总之,《Java for Programmers 2nd Edition》是一本全面且深入的Java教程,无论你是初涉Java的世界,还是希望提升自己的编程能力,这本书都能提供丰富的知识和实用的技巧。结合提供的源代码,你将能够更好地掌握Java...
此外,Java多线程编程是并发处理的关键。通过实现Runnable接口或继承Thread类,你可以创建并运行多个线程,理解线程同步和互斥的概念,以及synchronized关键字的使用,对于编写高效的并发程序至关重要。 在Java的...
总而言之,《Java网络高级编程》这本书全面覆盖了Java在网络编程领域的各个方面,无论你是希望提升现有技能的开发者,还是初涉网络编程的新手,都能从中获益匪浅。通过深入学习,你将能够利用Java的强大功能,构建出...
Java作为一门广泛使用的编程语言,其基础知识和实践经验对于初学者来说至关重要。...无论你是初涉Java的新人,还是寻求巩固基础的开发者,这个精选教程都能提供宝贵的资源,助你在Java的世界里稳步前行。
Java和JSP是Web开发领域...总的来说,"Java&&JSP最全资料"是一份宝贵的资源,无论你是初涉Java和JSP,还是寻求进阶提升,都能从中受益。通过深入学习和实践,你将能够熟练掌握这两种技术,从而在Web开发领域游刃有余。
【Java编程语言基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)于1995年推出。...无论你是初涉Java世界还是寻求深入理解,这个压缩包都能提供有价值的资源。
总的来说,《Java2参考大全》(第四版)是一本内容全面、深度适中的Java编程指南,无论你是初涉Java的新手,还是寻求提升的老兵,都能在这本书中找到你需要的知识。通过阅读并实践书中的内容,你将能够熟练掌握Java...
在本资源中,我们主要探讨的是使用Java编程语言进行游戏开发的一个实例——“打飞机”游戏。...因此,无论你是初涉Java游戏开发,还是希望提升自己的技能,这个“打飞机”游戏项目都是一个值得深入探索的学习资源。
Java及Java EE面试大全主要涵盖了Java语言的...对于初涉Java领域的求职者,理解并掌握以上知识点是面试成功的关键。在准备面试时,不仅要理解概念,还要能编写代码实现相关功能,同时对实际项目经验的积累也很重要。
总之,《JAVA入门、提高与精通》这份教材详尽地介绍了Java编程的各个方面,从基础到高级,适合不同层次的学习者,无论你是初涉编程的新手还是寻求提升的开发者,都能从中受益。通过学习,你将能够熟练掌握Java技术,...
作为初涉游戏开发的尝试,它展示了Java在游戏开发领域的应用潜力。下面将详细介绍这款游戏中涉及的主要Java技术和相关知识点。 1. **Java基础知识**:Java是一种跨平台的面向对象的编程语言,它的“一次编写,到处...
此外,Java的多线程特性也非常重要,因为它允许游戏同时处理多个任务,如游戏逻辑、渲染和用户输入,确保游戏流畅运行。 游戏的实现可能涉及到以下几个关键知识点: 1. **面向对象编程**:Java是一种面向对象的...
这份压缩包中的中文文章,无疑为JAVA学习者提供了一个全面且深入的学习路径,无论你是初涉JAVA的新手,还是寻求提升的开发者,都能从中受益。通过系统地学习和实践,可以有效地提高JAVA编程技能,更好地应对实际开发...
Java基础是编程世界的基石,尤其是对于那些初涉这个领域的人来说。Java是一种面向对象的、跨平台的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。它的设计目标是“简单、健壮、安全...
《Java葵花宝典——各种问题详细解答》 ...无论你是初涉Java的新手,还是希望巩固基础的开发者,都可以从中受益。通过深入学习和实践,你将能够熟练掌握Java,解决各种实际问题,成为一名出色的Java工程师。
无论你是初涉编程的新手,还是希望进一步提升的Java开发者,都能从中受益匪浅,不断深化对Java这门强大语言的认识和运用。通过解决复习题、编程题,以及深入理解例题程序,你将能够在Java的世界中游刃有余,为未来的...
在儿童教育领域,游戏化学习已经逐渐成为一种有效的教学手段,而Java平台因其跨平台、易学易用的...无论你是经验丰富的开发者还是初涉此领域的新人,都能从中获益,为打造富有创新和教育价值的儿童游戏奠定坚实基础。