`
victor-yang
  • 浏览: 18672 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

线程同步小结(1)

阅读更多

            本文小结关于synchronized线程同步机制的学习。首先需要了解什么是同步和异步,继承Thread类与实现Runnable接口的区别。

(一)简单的理解一下同步和异步:

         同步就是指一个线程要等待上一个线程执行完之后才开始执行当前的线程,

         异步是指一个线程去执行,它的下一个线程不必等待它执行完就开始执行。


(二)继承Thread类与实现Runnable接口的区别:


       在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;他们都是在java.lang包中定义的。

       先看一个继承Thread类的例子:

           public class Data {

 

	private int x = 0;
	public int getX(){
		return this.x;
	}
	/**
	 * 对X进行加法运算
	 * @param y:加数
	 * @return:返回加法的结果
	 */
	public int plus(int y){
		return this.x + y;
	}
}

public class MySyn extends Thread {

	private Data data = new Data();
	public static void main(String args[]){
		MySyn my1 = new MySyn();
		MySyn my2 = new MySyn();
		MySyn my3 = new MySyn();
		//启动这三个线程对象
		my1.start();
		my2.start();
		my3.start();
	}
	public void run(){
		for(int i = 0; i < 3; i++){
			this.data.plus(10);//给Data的x加上10
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "对应的Data对象的值是:" + this.data.getX());
		}
	}
}

            这是继承Thread类实现的多线程,运行结果是:


Thread-0对应的Data对象的值是:10
Thread-2对应的Data对象的值是:10
Thread-1对应的Data对象的值是:10
Thread-0对应的Data对象的值是:20
Thread-2对应的Data对象的值是:20
Thread-1对应的Data对象的值是:20
Thread-0对应的Data对象的值是:30
Thread-1对应的Data对象的值是:30
Thread-2对应的Data对象的值是:30

      显然,每个线程都各自执行自己的方法,都有自己的Data对象,不共享资源,互不干扰。

      再来看看用Runnable实现的,简单修改部分代码:


public class MySyn implements Runnable {
	private Data data = new Data();
	public static void main(String args[]){
		MySyn my = new MySyn();
		Thread my1 = new Thread(my, "A");
		Thread my2 = new Thread(my, "B");
		my1.start();
		my2.start();
	}
        ······

         运行结果有些令人不解:


A对应的Data对象的值是:20
B对应的Data对象的值是:20
B对应的Data对象的值是:40
A对应的Data对象的值是:40
A对应的Data对象的值是:60
B对应的Data对象的值是:60

      虽然这两个线程对象是并发的,但是结果确不是我们预想的。因为,这两个线程共享着同一个Data对象,为了出线这样的效果,在打印结果之前让线程对象休眠了10毫秒,给另一个线程充分的时间去修改数据。但是,事实上,我们在实际运用中并不希望出现这种情况,这样会引起线程的不安全。正是这种不安全,引出了主题:线程同步机制。


      那么这种实现多线程的方法的关联:

             1.用Thread类实现多线程,没有用Runnable接口实现的灵活;另外,                   查看源码Thread类实现了Runnable接口;

             2.一个类只能有一个父类,但是可以有多个接口,继承了Thread类就不                 能继承其他的类了;

             3.Runnable接口适合资源的共享。

 

(三)线程的启动


       一个线程大致可以分为   个状态:就绪(准备运行),运行,休眠(暂停),死亡。

      线程的启动必须用start()方法启动,当一个线程对象调用start()方法时,就进入了就绪状态,等待系统的调度,不会阻塞程序,代码继续向下执行。不可以用run()方法来启动程序,当调用run()方法时,程序会把run()方法当做普通方法对待,直到执行完run()方法,程序才可以向下继续执行;相反,调用start()方法,JVM会自动调用线程中的run()方法。当调用run方法时:


public static void main(String args[]){
		MySyn my1 = new MySyn();
		MySyn my2 = new MySyn();
		MySyn my3 = new MySyn();
		my1.run();
		my2.run();
		my3.run();
}

 的结果是:


main对应的Data对象的值是:10
main对应的Data对象的值是:20
main对应的Data对象的值是:30
main对应的Data对象的值是:10
main对应的Data对象的值是:20
main对应的Data对象的值是:30
main对应的Data对象的值是:10
main对应的Data对象的值是:20
main对应的Data对象的值是:30

      此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。

 

1
5
分享到:
评论

相关推荐

    Visual Basic.NET线程参考手册

    第1章 定义线程 1.1 线程的定义 1.1.1 多任务 1.1.2 进程 1.1.3 线程 1.2 Visual Basic.NET对线程的支持 1.2.1 System.AppDomain类 1.2.2 线程管理与.NET运行库 1.3 本章小结第2章 .NET中的线程 2.1 System....

    java线程详解

    八、线程同步小结 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:volatile关键字 Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、延迟连接池 五、...

    多线程编程指南(系统描述了线程标准 线程同步 多线程编程原则 等)

    线程同步20 使用64 位体系结构20 2 基本线程编程23 线程库................................................................................................................................................. ...

    java应用程序中使用线程

    锁定排序 3.6 线程优先级 3.7 监控程序线程 3.8 在应用程序中加入线程 ...线程中的过时方法 3.12 DownloadFiles类 3.13 未捕捉的异常 3.14 自愿放弃处理器 3.15 并发工具 3.16 小结

    多线程完整(C#),综合概念与例子,详细讲述多线程的运用

    1.多线程的概念 2.操纵线程 3.线程的同步和通讯 4.线程池和定时器 5.互斥对象 6.小结

    5操作系统实验报告.doc

    程,熟练掌握线程的创建pthread_create(),线程终止pthread_exit(),等待线程合 并pthread_join()等线程控制的操作,利用信号量或者互斥锁实现线程间的同步。 二、实验内容 问题:求 100000 个浮点数(精确小数点右 ...

    操作系统实验报告_进程同步与互斥.doc

    操作系统实验报告_进程同步与互斥.doc

    Java程序设计案例教程-第8章-多线程编程.pptx

    本章的学习目标 了解进程和线程的基本概念和区别 掌握创建线程的两种方法 掌握线程同步的概念和方法 了解线程的优先级 掌握线程间通信的方法 第3页 Java程序设计案例教程-第8章-多线程编程全文共36页,当前为第3页...

    c#多线程中Lock()关键字的用法小结

    其中,lock是一种比较好用的简单的线程同步方式,它是通过为给定对象获取互斥锁来实现同步的。它可以保证当一个线程在关键代码段的时候,另一个线程不会进来,它只能等待,等到那个线程对象被释放,也就是说线程出了...

    NET compact FrameWork移动开发指南 首发绝对清晰版

    * 书名:.NET compact FrameWork移动开发指南 * 作者:颜友宁 * 来源:清华大学出版社 * 出版时间:2006年11月 * ISBN:暂无 * 定价:63元 看 书 评 论 收 藏打 分 购 买 ...* 24.11 线程同步 * 24.12 小结

    NET compact FrameWork移动开发指南 绝对清晰版

    NET compact FrameWork移动开发指南.part1 NET compact FrameWork移动开发指南 * 书名:.NET compact FrameWork移动开发指南 * 作者:颜友宁 * 来源:清华大学出版社 ...* 24.11 线程同步 * 24.12 小结

    UNIX环境高级编程_第二版中文

    11.6 线程同步  11.7 小结  习题  第12章 线程控制  12.1 引言  12.2 线程限制  12.3 线程属性  12.4 同步属性  12.5 重入  12.6 线程私有数据  12.7 取消选项  12.8 线程和信号  12.9 ...

    Java SE实践教程 源代码 下载

    1.3 小结 35 第2章 对象无处不在——面向对象的基本概念 37 2.1 讲解 38 2.1.1 什么是面向对象 38 2.1.2 面向对象的基本概念 38 2.1.3 Java对面向对象的支持 41 2.2 练习 42 2.2.1 JavaBeans技术开发可重用...

    JAVA 清华大学 教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...

    清华大学JAVA教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...

    Java编程语言详细教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...

    JAVA清华大学教程

    ◇本讲小结 ◇课后习题 ★ 第二讲 Java语言基础知识 ◇课前索引 ◇2.1 简单数据类型 ◇2.2 运算符和表达式 ◇2.3 控制语句 ◇2.4 数组 ◇2.5 字符串的处理 ◇本讲小结 ◇课后习题 ★ 第三讲 Java语言...

    Visual C++2010开发权威指南.part06

    第12章 Visual C++ 2010 MFC文件与 第12章 注册表操作 479 12.1 文本操作串行化 479 12.1.1 文档类Serialize()函数 479 12.1.2 CArchive对文件进行读写 482 12.1.3 文档操作串行化代码分析 485 ...14.8 小结 579

Global site tag (gtag.js) - Google Analytics