`
Lucas_
  • 浏览: 4800 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java并发编程:线程安全

 
阅读更多

 Java并发编程:线程安全 

当多个线程需要同时访问同一个资源(成为临界资源)时,可能会对数据造成破坏。 

例如:money += 1000;  当第一个线程取出money值,然后+1000完成这两步之后,第二个进程进入读取了count的值,又+1000 再赋值给count。 这时 第一个线程再进行第三步,把它的值赋给count,这就出现了混乱,没有达到预期的效果(两个线程只存进去了1000)。

所以,需要同步互斥访问来解决线程安全问题。 Java提供了  synchronized 和 Lock 方式进行同步互斥访问。

 

1.synchronized 关键字

->实例方法同步,对对象加锁

public synchronized void add(int i){
i += 1;
}

一个线程只能访问一个实例变量的add()方法

 

->静态方法同步

public static synchronized void add(int i){
i += 1;
}

同步在该方法所在的类对象(JVM中一个类只有一个类对象.class)上,所以同时只允许一个线程执行同一个类中的静态同步方法。

 

 

->实例方法中的同步块

public void add(int i){
synchronized(this){   //this指代调用add()方法的实例对象(即监视器对象),一次只有一个线程可以执行该同步代码块
   	i += 1;	 //当在某个线程中执行这段代码块,该线程获取这个对象的锁,从而使得其他线程无法同时访问该代码块。
   }
}

->静态方法中的同步块

 

	public static synchronized void add(int i){		//只能被类对象的一个线程访问
				synchronized(this){   
			    	i += 1;
			    }
			}

对于synchronized方法或者synchronized代码块,当出现异常时,JVM会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象。

 

 

下面有两个栗子:

1).多个线程访问共享数据:设计4个线程,其中两个对j增加1,另外两个对j减少1

public class MultiThreadShareData {
		
			private int j;
			public static void main(String[] args) {
				MultiThreadShareData mts = new MultiThreadShareData();
				Inc inc = mts.new Inc(); 
				Dec dec = mts.new Dec();
				
				for(int i=0; i<2; i++){
					Thread t1 = new Thread(inc);
					t1.start();
					
					t1 = new Thread(dec);
					t1.start();
				}
			}
			
			private synchronized void inc(){
				j++;
				System.out.println(Thread.currentThread().getName() + "-inc:" + j);
			}
			
			private synchronized void dec(){
				j--;
				System.out.println(Thread.currentThread().getName() + "-dec:" + j);
			}
		
			class Inc implements Runnable{
				public void run() {
					for(int i=0; i<100; i++){
						inc();
					}
				}
			}
		
			class Dec implements Runnable {
				public void run() {
					for(int i=0; i<100; i++) {
						dec();
					}
				}
			}
}

 

2).设计程序:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次。

public class ThreadCommunication {	
				public static void main(String[] args) {
					
					final Business bussiness = new Business();
					new Thread(new Runnable(){
						public void run() {
							for(int i=1; i<=50; i++){
								bussiness.sub(i);
							}
						}
					}).start();
					
					for(int i=1; i<=50; i++){
							bussiness.main(i);
					}
				}
			}
			
			class Business{
			private boolean bShouldSub = true;
			public synchronized void sub(int i) {
				while(!bShouldSub){
					try {
						this.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
					
				for(int j=1; j<=10; j++) {
						System.out.println("sub thread sequence of " + j + ", loop of " + i ); 
				}
				bShouldSub = false;
				this.notify();
				
			}
			
			public synchronized void main(int i) {
				while(bShouldSub){
					try {
						this.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}	
				}
				for(int j=1; j<=100; j++) {
					System.out.println("main thread sequence of " + j + ", loop of " + i ); 
				}
				bShouldSub = true;
				this.notify();
			}
		}

 

分享到:
评论

相关推荐

    java并发编程:线程基础

    本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...

    java并发编程:juc线程池

    通过深入了解 Java 并发编程和 JUC 线程池,您可以更好地管理线程之间的协作和同步,充分发挥多核处理器的优势,确保程序稳定运行。 了解 Java 并发编程和 JUC 线程池是现代软件开发者的必备知识。通过掌握并发编程...

    java并发编程:juc、aqs

    Java 并发编程中的 JUC(java.util.concurrent)库以及其核心组件 AQS(AbstractQueuedSynchronizer)在构建高性能、可伸缩性的多线程应用方面具有重要的地位。 AQS 是 JUC 中的核心组件,它提供了一个框架,让...

    java并发编程2

    java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf

    java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

    《Java并发编程:设计原则与模式(第二版)》

    《Java并发编程:设计原则与模式(第二版).pdf》,自己看看

    Java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...

    Java 并发核心编程

    自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。...开发者通过这些基础的接口可以构建高并发、线程安全的java应用程序。

    《java 并发编程实战高清PDF版》

    深入讲解java并发编程技术,多线程、锁以及java内存模型等

    Java并发编程实战

    第2章 线程安全性 2.1 什么是线程安全性 2.2 原子性 2.2.1 竞态条件 2.2.2 示例:延迟初始化中的竞态条件 2.2.3 复合操作 2.3 加锁机制 2.3.1 内置锁 2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第...

    JAVA并发编程实践 .pdf

    《Java并发编程实战》深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证...

    一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版)

    博文链接:https://projector.iteye.com/blog/209636

    java并发编程从入门到精通

    《Java并发编程从入门到精通》内容包括并发编程概念,线程,线程安全,线程集合类,线程阀,线程池,Fork/Join,线程、线程池在互联网项目开发的应用,线程监控及线程分析,Android中线程应用。 本书适合Java开发...

    java 并发编程 多线程

    java 并发 编程 多线程 concurrent lock condition executorserice executor java.util.curcurrent.

    《java并发编程的核心方法和框架》

    《java并发编程的核心方法和框架.pdf》,好好学习,天天向上。。。

    Java 并发编程:设计原则与模式

    网络编程,分布式,并发,多线程,多进程学习必备

    JAVA并发编程实战_标签.pdf

    《Java并发编程实战》是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程...

    Java 并发编程实战.pdf

    《java并发编程实战》是java并发的圣经。亲自整理目录结构,层级分明(福昕阅读器整理)。高清。

Global site tag (gtag.js) - Google Analytics