package com.robingdo.test; public class ThreadWithOutLockTest implements Runnable { private int bit=100; public void run() { System.out.println("pre"+this.bit+":threadname:"+Thread.currentThread().getName()); bit--; System.out.println("aft"+this.bit+":threadname:"+Thread.currentThread().getName()); } public static void main(String s[]) { ThreadWithOutLockTest test=new ThreadWithOutLockTest(); Thread thread1=new Thread(test,"thread1"); Thread thread2=new Thread(test,"thread2"); Thread thread3=new Thread(test,"thread3"); Thread thread4=new Thread(test,"thread4"); thread1.start(); thread2.start(); thread3.start(); thread4.start(); } }
两次执行后,后台的打印结果是:
pre100:threadname:thread2
pre100:threadname:thread4
pre100:threadname:thread3
aft97:threadname:thread3
pre100:threadname:thread1
aft98:threadname:thread4
aft99:threadname:thread2
aft96:threadname:thread1
pre100:threadname:thread1
aft99:threadname:thread1
pre99:threadname:thread2
pre99:threadname:thread3
aft97:threadname:thread3
aft98:threadname:thread2
pre97:threadname:thread4
aft96:threadname:thread4
第二次的运行结果明显看出有问题,原因就在于多线程是并发运行的,4个线程几乎同一时间进入成员方法run(),然后对bit减一,执行system打印的时候也是并发的,所以四个线程打印出来的结果都可能是100,99,98,97,96其中任何一个,所以综上,多线程对于成员对象和成员方法的调用,如果不控制并发机制,那么几乎是乱套的,所以现在来看下怎么做才能使线程有序执行,其实乱套的根本原因就是4个线程并发进入成员方法run(),所以我们确保进入run()方法的线程只能有一个,而且必须在执行完了该方法,另外一个线程才能进入该方法,这就是多线程里面的锁的概念,现在对以上程序做下修改
package com.robingdo.test; public class ThreadWithLockTest implements Runnable { private int bit=100; public void run() { String lock="lock"; synchronized (lock) { System.out.println("pre"+this.bit+":threadname:"+Thread.currentThread().getName()); bit--; System.out.println("aft"+this.bit+":threadname:"+Thread.currentThread().getName()); } } public static void main(String s[]) { ThreadWithLockTest test=new ThreadWithLockTest(); Thread thread1=new Thread(test,"thread1"); Thread thread2=new Thread(test,"thread2"); Thread thread3=new Thread(test,"thread3"); Thread thread4=new Thread(test,"thread4"); thread1.start(); thread2.start(); thread3.start(); thread4.start(); } }
在run方法加入锁对象,把方法体用同步块上锁,这样进入方法的线程只有一个,并且其他线程只能在释放资源后才能获得资源,执行两次程序,打印出来的结果是
pre100:threadname:thread1
aft99:threadname:thread1
pre99:threadname:thread4
aft98:threadname:thread4
pre98:threadname:thread3
aft97:threadname:thread3
pre97:threadname:thread2
aft96:threadname:thread2
pre100:threadname:thread1
aft99:threadname:thread1
pre99:threadname:thread4
aft98:threadname:thread4
pre98:threadname:thread3
aft97:threadname:thread3
pre97:threadname:thread2
aft96:threadname:thread2
这样打印结果就正常了
相关推荐
Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
通过分析并实践`threadTest`案例,我们可以深入理解Java多线程的原理和使用技巧,为编写高效并发程序打下坚实基础。同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的...
总之,实现Java多线程进度条涉及线程同步、共享数据更新以及UI更新的协调。理解这些核心概念,并根据具体需求选择合适的方法,是构建高效、用户友好进度条的关键。在ProgressTest这个示例项目中,你可能会找到更多...
本示例"java多线程的条件对象和锁对象demo"着重探讨了如何利用锁对象和条件对象来精细控制线程的执行流程。 首先,我们需要了解Java中的锁对象。Java提供了多种类型的锁,其中最基础的是`synchronized`关键字,它...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
"Java多线程同步.pdf" Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用...
Java多线程同步是Java编程中关键的并发概念,它涉及到如何在多个线程访问共享资源时保持数据的一致性和完整性。`java.util.concurrent`包是Java提供的一个强大的并发工具库,它为开发者提供了多种线程安全的工具,...
《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...
在Java编程中,多线程并发是...总之,Java的多线程并发实例可以帮助我们更好地理解和实践线程控制、同步机制以及经典的设计模式,提升我们的编程能力。通过不断学习和实践,我们可以编写出高效、安全的多线程并发程序。
### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点。 首先,多线程的核心概念包括线程的创建与启动。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。创建后...
`多线程.docx`可能是关于Java多线程的深入讲解,涵盖线程安全、线程同步、锁的使用等方面。 总之,理解并熟练掌握Java多线程和锁机制对于编写高效、健壮的并发代码至关重要。通过实践和案例学习,可以更好地理解...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
总的来说,Java多线程技术包括线程的创建、管理、同步、通信以及异常处理等多个方面。深入理解和熟练掌握这些知识,对于编写高效、可靠的并发程序至关重要。在实际开发中,结合《Java多线程编程核心技术_完整版 带...
Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...