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线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:...
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。本篇文章主要介绍了Java多线程-线程的同步与锁的问题,有兴趣的可以了解一下。
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
包括java的Thread类,同步块(synchronized),可重入锁,Object方法以及对象监视器等内容。
java 多线程导入excel数据,预防高并发,线程同步锁,
最新java面试关于多线程,锁,同步相关知识总结
本次实验了解线程与进程的概念、区别与联系,掌握了多线程的内涵与使用场景,掌握了线程的状态与生命周期,掌握了Java实现多线程的两种方式,理解了临界区、对象锁、互斥、同步等核心概念,理解了线程的互斥与同步,...
1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。2.讲解了在多线程中对并发访问的控制, 主要就是synchronized的使用, 由于此关键字在使用上非常灵活, 所以书中用了很多案例来介绍此关键字的使用, 为...
Java多线程--避免同步机制带来的死锁问题及用Lock锁解决线程安全问题
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
NoHttp核心架构之多线程通信、线程安全、线程同步;synchronized锁,Lock锁;具体讲解请移步博客:http://blog.csdn.net/yanzhenjie1003/article/details/50992468
锁正是基于这种思路实现的一种线程同步机制。 在对共享数据加锁后,每个线程在访问共享数据时必须先申请相应的锁。一旦获得锁后,就可以访问共享数据,并且一个锁同一时刻只能被一个线程持有,这意味着获得锁后不会...
本篇文章提供了20道高难度的Java多线程编程面试题及详细解析,旨在帮助开发者展示出卓越的并发编程能力。在当今高并发的应用场景下,对多线程编程的理解和应用是评估面试者的重要指标。通过这些高难度问题,您将全面...
java多线程的创建,主流的几种创建方式都有详细的讲解。线程的交互以及线程的同步锁的问题都有具体的实例。java的内存模型,java会话都有讲解,如果是刚接触java多线程,可以下载来看看
同步控制是并发程序必不可少的重要手段,本文我们将通过重入锁、读写锁、信号量、倒计数器和循环栅栏以及他们的实例来介绍Java并发程序中的同步控制。 目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ...
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...