(多线程)多线程的同步代码块与同步函数

标签: 多线程 多线程 同步 | 发表时间:2013-11-07 00:17 | 作者:schy_hqh
出处:http://www.iteye.com

 

多线程加锁,2种方式

 

1.同步代码块,使用的锁可以是任意对象,但是操作共享资源时,锁必须唯一!

 

2.同步函数,使用的锁是this!

 

package com.gc.thread;

public class SynchronizdMethod implements Runnable {

	//共享资源
	private int num = 1000;
	
	//不同的线程进入不同的同步代码中,验证同步函数使用的锁与同步代码块的锁是否一致
	//如果不一致,则会导致数据混乱!
	boolean flag = true;
	
	@Override
	public void run() {
		if(flag) {
			//改变标记,当b线程开启后,执行run(),就会进入到同步函数中
			flag = false;
			while(true) {
				//同步代码块。判断 num>0 和 num-- 都是对共享资源进行操作,所以要放在同步代码块中
				synchronized(this) {
					//只要本次的同步代码块中的代码没有执行完,其它线程无法进入,因为锁没有释放
					if(num>0)
						System.out.println(Thread.currentThread().getName() + ": code segment--->" + num--);
				}
			}
		} else {
			while(true)
				anotherThread();
		}
	}
	
	//同步函数---使用函数对操作共享资源的代码进行封装,再将锁声明在方法上
        //使用的锁是this,即传入Thread构造函数中的Runnable子类对象
	private synchronized void anotherThread() {
		if(num>0)
			System.out.println(Thread.currentThread().getName() + ": method--->" + num--);
	}

}

 

开启多线程

package com.gc.thread;

public class Demo {
	public static void main(String[] args) {
		
		SynchronizdMethod runnable = new SynchronizdMethod();
		
		//传入同一个Runnable接口子类对象,让多线程操作Runnable中封装的共享资源
		Thread a = new Thread(runnable);
		Thread b = new Thread(runnable);
		
		//开启线程  【注意:一个线程只能调用1次start(),多次调用将抛"线程运行状态异常"】
		a.start();
		//让主线程睡眠一小会,让a线程先执行,a线程将执行同步代码块中的代码
		try {
			Thread.sleep(10);//主线程睡眠的目的:让a线程先进入到同步代码块中,将标记改为false
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//a线程改变flag标记之后,再开启b线程,让b线程执行同步函数中的代码
		b.start();
	}
}

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [多线程 多线程 同步] 推荐:

Java多线程(二)同步

- - CSDN博客编程语言推荐文章
如果你的java基础较弱,或者不大了解java多线程请先看这篇文章 java多线程(一)线程定义、状态和属性. 同步一直是java多线程的难点,在我们做android开发时也很少应用,但这并不是我们不熟悉同步的理由. 希望这篇文章能使更多的人能够了解并且应用java的同步. 在多线程的应用中,两个或者两个以上的线程需要共享对同一个数据的存取.

(多线程)多线程的同步代码块与同步函数

- - 编程语言 - ITeye博客
1.同步代码块,使用的锁可以是任意对象,但是操作共享资源时,锁必须唯一. 2.同步函数,使用的锁是this. //不同的线程进入不同的同步代码中,验证同步函数使用的锁与同步代码块的锁是否一致. //如果不一致,则会导致数据混乱. //改变标记,当b线程开启后,执行run(),就会进入到同步函数中. 判断 num>0 和 num-- 都是对共享资源进行操作,所以要放在同步代码块中.

Java 多线程同步的五种方法

- - 编程语言 - ITeye博客
4、wait() 与 notify(). 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊. 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常. 举 个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块.

Java Thread多线程

- - CSDN博客推荐文章
Java Thread多线程. Java 多线程例子1 小例子. super("zhuyong");//设置线程的名字,默认为“TestThread”. Java 多线程例子2 前台线程(用户线程) 后台线程(守护线程 ). 1,setDaemon(true)后就是后台线程(守护线程 ),反之就是前台线程(用户线程).

Java多线程之synchronized

- - CSDN博客推荐文章
这里通过三个测试类阐述了synchronized应用的不同场景. 首先是最基本的synchronized Method的使用.  * @see 概述:Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor) .  * @see 说明:当synchronized关键字修饰一个方法时,则该方法为同步方法 .

[转]GDB调试多线程

- - 小彰
GDB 多线程调试基本命令 实现简介 以及一个问题的解决. 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 切换当前调试的线程为指定ID的线程.

java多线程总结

- - Java - 编程语言 - ITeye博客
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是:. class 类名 extends Thread{. * @author Rollen-Holt 继承Thread类,直接调用run方法.             System.out.println(name + "运行     " + i);.

[转]Oracle Parallel 多线程

- - Oracle - 数据库 - ITeye博客
对于一个大的任务,一般的做法是利用一个进程,串行的执行,如果系统资源足够,可以采用parallel技术,把一个大的任务分成若干个小的任务,同时启用n个进程/线程,并行的处理这些小的任务,这些并发的进程称为并行执行服务器(parallel executeion server),这些并发进程由一个称为并发协调进程的进程来管理.

Java多线程学习

- - CSDN博客编程语言推荐文章
  线程是一种轻量级的进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单. 即多个线程可以同时执行,就像有多条流水线一样,可以同时进行工作,是并发执行的.   程序是由进程组成的,进程是由线程组成的.

多线程教程之二---线程间同步 - 白永辉的专栏 - 博客频道 - CSDN.NET

- Yi - blog.csdn.net
资料收集类的 都是比较经典的东西.  安装Chrome浏览器下载资源送30个下载分.                                        500元移动大会门票开抢. 2011移动开发者大会亮点之二:七大论坛神秘嘉宾闪亮登场.                “IT适合你吗.