`
mwei
  • 浏览: 123987 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

初涉java多线程(一)

    博客分类:
  • java
阅读更多
十一期间看了一点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编程精选集锦(附源代码)

    总的来说,《Java编程精选集锦》是一本全面且实用的Java学习资料,无论你是初涉Java编程的新手,还是寻求进阶的开发者,都能从中受益。通过深入阅读和实践,你将能够熟练掌握Java编程,并具备在J2EE平台上构建复杂...

    Java.for.Programmers.2ed.2012

    总之,《Java for Programmers 2nd Edition》是一本全面且深入的Java教程,无论你是初涉Java的世界,还是希望提升自己的编程能力,这本书都能提供丰富的知识和实用的技巧。结合提供的源代码,你将能够更好地掌握Java...

    JAVA好资料打包下载

    此外,Java多线程编程是并发处理的关键。通过实现Runnable接口或继承Thread类,你可以创建并运行多个线程,理解线程同步和互斥的概念,以及synchronized关键字的使用,对于编写高效的并发程序至关重要。 在Java的...

    java网络高级编程PDF电子书

    总而言之,《Java网络高级编程》这本书全面覆盖了Java在网络编程领域的各个方面,无论你是希望提升现有技能的开发者,还是初涉网络编程的新手,都能从中获益匪浅。通过深入学习,你将能够利用Java的强大功能,构建出...

    最经典的Java基础实验与案例开发指导教程精选

    Java作为一门广泛使用的编程语言,其基础知识和实践经验对于初学者来说至关重要。...无论你是初涉Java的新人,还是寻求巩固基础的开发者,这个精选教程都能提供宝贵的资源,助你在Java的世界里稳步前行。

    Java&&JSP最全资料

    Java和JSP是Web开发领域...总的来说,"Java&&JSP最全资料"是一份宝贵的资源,无论你是初涉Java和JSP,还是寻求进阶提升,都能从中受益。通过深入学习和实践,你将能够熟练掌握这两种技术,从而在Web开发领域游刃有余。

    Java-1premierfg (10).zip

    【Java编程语言基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)于1995年推出。...无论你是初涉Java世界还是寻求深入理解,这个压缩包都能提供有价值的资源。

    Java2参考大全(java第四版)

    总的来说,《Java2参考大全》(第四版)是一本内容全面、深度适中的Java编程指南,无论你是初涉Java的新手,还是寻求提升的老兵,都能在这本书中找到你需要的知识。通过阅读并实践书中的内容,你将能够熟练掌握Java...

    JAVA开发Java游戏设计打飞机程序(源代码+论文).zip

    在本资源中,我们主要探讨的是使用Java编程语言进行游戏开发的一个实例——“打飞机”游戏。...因此,无论你是初涉Java游戏开发,还是希望提升自己的技能,这个“打飞机”游戏项目都是一个值得深入探索的学习资源。

    java及java EE面试大全

    Java及Java EE面试大全主要涵盖了Java语言的...对于初涉Java领域的求职者,理解并掌握以上知识点是面试成功的关键。在准备面试时,不仅要理解概念,还要能编写代码实现相关功能,同时对实际项目经验的积累也很重要。

    JAVA入门、提高与精通

    总之,《JAVA入门、提高与精通》这份教材详尽地介绍了Java编程的各个方面,从基础到高级,适合不同层次的学习者,无论你是初涉编程的新手还是寻求提升的开发者,都能从中受益。通过学习,你将能够熟练掌握Java技术,...

    Java小游戏——雷电

    作为初涉游戏开发的尝试,它展示了Java在游戏开发领域的应用潜力。下面将详细介绍这款游戏中涉及的主要Java技术和相关知识点。 1. **Java基础知识**:Java是一种跨平台的面向对象的编程语言,它的“一次编写,到处...

    java简易小游戏.zip

    此外,Java的多线程特性也非常重要,因为它允许游戏同时处理多个任务,如游戏逻辑、渲染和用户输入,确保游戏流畅运行。 游戏的实现可能涉及到以下几个关键知识点: 1. **面向对象编程**:Java是一种面向对象的...

    中文文章(JAVA).rar

    这份压缩包中的中文文章,无疑为JAVA学习者提供了一个全面且深入的学习路径,无论你是初涉JAVA的新手,还是寻求提升的开发者,都能从中受益。通过系统地学习和实践,可以有效地提高JAVA编程技能,更好地应对实际开发...

    java basics

    Java基础是编程世界的基石,尤其是对于那些初涉这个领域的人来说。Java是一种面向对象的、跨平台的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。它的设计目标是“简单、健壮、安全...

    java葵花宝典——各种问题详细解答

    《Java葵花宝典——各种问题详细解答》 ...无论你是初涉Java的新手,还是希望巩固基础的开发者,都可以从中受益。通过深入学习和实践,你将能够熟练掌握Java,解决各种实际问题,成为一名出色的Java工程师。

    Java语言程序设计第8版 习题解答+例题程序

    无论你是初涉编程的新手,还是希望进一步提升的Java开发者,都能从中受益匪浅,不断深化对Java这门强大语言的认识和运用。通过解决复习题、编程题,以及深入理解例题程序,你将能够在Java的世界中游刃有余,为未来的...

Global site tag (gtag.js) - Google Analytics