`
AlexanderMahone
  • 浏览: 8368 次
社区版块
存档分类
最新评论

Java 多线程

阅读更多
当两个线程可能会访问一个对象的某个属性值(field)(包括读写),就要同步所有的读写该属性值(field)的所有方法。(
  • 当然通过反射直接修改该属性值,或者通过未同步的方法仍旧可以使该对象的值处于不稳定(unstable)的状态
  • 假如没有同步被多个线程访问对象属性的方法,有可能其中的一个方法正处于执行当中,并修改了该对象的一些属性值,但是还没有完全执行完,并返回,此时的中属性值并不稳定,完整。如果此时另一个线程访问到了这个处于不稳定的属性值,将得到bug。


现代的处理器当中都有多个内核,每个内核中可能会缓存每个线程中的值,如果多个线程需要访问同一个值,而这个值的修改由于缓存到cpu的寄存器当中,造成其他访问该属性值的线程对此对象的更改不可见,并由此产生bug,由此可以用volatile关键字强迫jvm关闭优化,将该属性值写入到内存中,并由各个线程从内存中读取(但是并不建议除了多线程专家之外的人员用volatile关键字,尽量使用synchronized关键字来同步数据)。synchronized 关键字(包括synchronized block)同样有这种效果。

synchronized 方法,和synchronized block会排出其他synchronized 方法或者synchronized block对其加锁的对象的访问,但是并不排除被其加锁对象的非synchronized方法的访问。(可以看下面的程序示例)

synchronized block (synchronized 块),和synchronized 方法的区别:
synchronized block 可以用其他对象的锁来同步块内的操作,而synchronized方法,只能对拥有其方法的对象加锁来同步方法内的操作。所以某种程度上synchronied(this){}和synchronized 方法的作用是一样的。

最好不要将ReentrantLock和synchronized关键字混搭在一个对象里,因为彼此无法排出(exclude)对方的操作,也就无法有效地对同一个对象进行同步。

package interaction.thinkinjava.concurrency;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class EX15Copy {
	public static void main(String[] args) {
		new Timer().schedule(new TimerTask() {
			
			@Override
			public void run() {
				System.out.println("System is ready to exit");
				System.exit(0);
			}
		}, 5000);
		
		ExecutorService es = Executors.newCachedThreadPool();
		Model m = new Model();
		es.execute(m.getYourTask(0));
		es.execute(m.getYourTask(1));
		es.execute(m.getYourTask(2));
		es.execute(m.getYourTask(3));
	}

}


class Model{
	private  class Task implements Runnable{
		private final int funToCall;
		Task(int functionCode){
			this.funToCall = functionCode;
		}
		@Override
		public void run() {
			switch(funToCall){
				case 0:
					while(true){
						f();
					}
				case 1:
					while(true){
						h();
					}
				case 2:
					while(true){
						g();
					}
				case 3:
					while(true){
						k();
					}
			}
		}
		
	}
	
	public Runnable getYourTask(int funCode){
		return new Task(funCode);
	}
	
	public synchronized void f(){
			System.out.println("f() function get the lock");
			try {
				TimeUnit.MILLISECONDS.sleep(200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			Thread.yield();
			System.out.println("f() function done its job");
	}
	
	public synchronized void h(){
			System.out.println("h() function get the lock");
			try {
				TimeUnit.MILLISECONDS.sleep(200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			Thread.yield();
			System.out.println("h() function done its job");
	}
	
	public synchronized void g(){
			System.out.println("g() function get the lock");
			try {
				TimeUnit.MILLISECONDS.sleep(200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			Thread.yield();
			System.out.println("g() function done its job");
	}
	public void k(){
		System.out.println("k() function run");
		try {
			TimeUnit.MILLISECONDS.sleep(200);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		Thread.yield();
		System.out.println("k() function done its job");
	}
}


结果
f() function get the lock
k() function run
f() function done its job
g() function get the lock
k() function done its job
k() function run
g() function done its job
k() function done its job
k() function run
g() function get the lock
g() function done its job
.....

可以看出被synchronized修饰的f,h,g方法都是有顺序的访问,而没有被synchronized关键字修饰的k方法则是穿插在其中
分享到:
评论

相关推荐

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    java 多线程操作数据库

    ### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    java多线程分页查询

    ### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    深入浅出 Java 多线程.pdf

    在本文中,我们将深入浅出Java多线程编程的世界,探索多线程编程的基本概念、多线程编程的优点、多线程编程的缺点、多线程编程的应用场景、多线程编程的实现方法等内容。 一、多线程编程的基本概念 多线程编程是指...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    java多线程实现大批量数据导入源码

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    java多线程查询数据库

    综上所述,"java多线程查询数据库"是一个涉及多线程技术、线程池管理、并发控制、分页查询等多个方面的复杂问题。通过理解和掌握这些知识点,我们可以有效地提高数据库操作的效率和系统的响应速度。

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    java多线程,对多线程,线程池进行封装,方便使用

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,我们可以通过实现Runnable接口或继承Thread类来创建线程。然而,直接使用线程可能存在一些问题,如资源管理...

    JAVA多线程编程技术PDF

    这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点。 首先,多线程的核心概念包括线程的创建与启动。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。创建后...

    Java多线程编程技术

    《Java多线程编程核心技术》建议猿友们读两遍,因为其写得没有那么抽象,第一遍有些概念不是很理解,可以先跳过并记录起来,第一遍阅读的目的主要是了解整个架构。第二遍再慢慢品味,并贯穿全部是指点来思考,并将...

Global site tag (gtag.js) - Google Analytics