`

java多线程为什么加同步锁

 
阅读更多
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线程:线程的交互 Java线程:线程的调度-休眠...

    java多线程通信图解

    java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...

    Java多线程-线程的同步与锁的问题

    线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。本篇文章主要介绍了Java多线程-线程的同步与锁的问题,有兴趣的可以了解一下。

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    Java多线程编程

    包括java的Thread类,同步块(synchronized),可重入锁,Object方法以及对象监视器等内容。

    多线程导入excel 数据

    java 多线程导入excel数据,预防高并发,线程同步锁,

    Java面试宝典2021-多线程,锁,同步.pdf

    最新java面试关于多线程,锁,同步相关知识总结

    实验八:Java多线程

    本次实验了解线程与进程的概念、区别与联系,掌握了多线程的内涵与使用场景,掌握了线程的状态与生命周期,掌握了Java实现多线程的两种方式,理解了临界区、对象锁、互斥、同步等核心概念,理解了线程的互斥与同步,...

    java多线程编程_java多线程_

    1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。2.讲解了在多线程中对并发访问的控制, 主要就是synchronized的使用, 由于此关键字在使用上非常灵活, 所以书中用了很多案例来介绍此关键字的使用, 为...

    Java多线程-避免同步机制带来的死锁问题及用Lock锁解决线程安全问题

    Java多线程--避免同步机制带来的死锁问题及用Lock锁解决线程安全问题

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    Java、Android多线程、线程安全、线程同步

    NoHttp核心架构之多线程通信、线程安全、线程同步;synchronized锁,Lock锁;具体讲解请移步博客:http://blog.csdn.net/yanzhenjie1003/article/details/50992468

    Java多线程编程 线程同步机制.docx

    锁正是基于这种思路实现的一种线程同步机制。 在对共享数据加锁后,每个线程在访问共享数据时必须先申请相应的锁。一旦获得锁后,就可以访问共享数据,并且一个锁同一时刻只能被一个线程持有,这意味着获得锁后不会...

    Java 多线程编程面试集锦20道问题解答Java多线程编程高难度面试题及解析

    本篇文章提供了20道高难度的Java多线程编程面试题及详细解析,旨在帮助开发者展示出卓越的并发编程能力。在当今高并发的应用场景下,对多线程编程的理解和应用是评估面试者的重要指标。通过这些高难度问题,您将全面...

    java会话管理、多线程.docx

    java多线程的创建,主流的几种创建方式都有详细的讲解。线程的交互以及线程的同步锁的问题都有具体的实例。java的内存模型,java会话都有讲解,如果是刚接触java多线程,可以下载来看看

    详解java多线程的同步控制

    同步控制是并发程序必不可少的重要手段,本文我们将通过重入锁、读写锁、信号量、倒计数器和循环栅栏以及他们的实例来介绍Java并发程序中的同步控制。 目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

Global site tag (gtag.js) - Google Analytics