多线程同步操作——多线程技术三

标签: 多线程同步操作 synchronized 同步锁 线程锁
10人阅读 评论(0) 收藏 举报
分类:

线程的同步在多线程中是十分重要的,保证程序中多个线程有序执行不冲突,并且能够达到程序员的要求。

同步的实现方面有两种,分别是synchronized,wait与notify

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

注:wait(),notify():必须在synchronized内部使用。

第一个列子:

运用synchronized同步有两种方式:同步方法,同步方法块

下面运用代码测试来介绍一下synchronized同步的两种方式

public class LockThread2 extends Thread {
	
	
	//同步方法
	public synchronized void synchronizedMethod(){
		for (int i = 0; i < 10; i++) {
			System.out.println("1");
			try {
				sleep(500);
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
	
	//同步方法块
	public void synchronizedNei(){
		synchronized (this) {
			for (int i = 0; i < 10; i++) {
				System.out.println("2");
				try {
					sleep(500);
				} catch (Exception e) {
					// TODO: handle exception
				}
			}
		}
		
	}
	
	public static void main(String[] args) {
		LockThread2 test1=new LockThread2();
		Thread lockThread1=new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				test1.synchronizedMethod();
			}
		});
		
		Thread lockThread2=new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				test1.synchronizedNei();
			}
		});
		lockThread1.start();
		lockThread2.start();
	}
	
}

测试结果:按序输出,先输出1的线程,等1执行结束之后,在执行2的线程


如果去掉关键字synchronized,两个线程将乱序输出。

 

* 上面两个测试方法,一个同步方法一个同步方法块,并且启动两个线程进行测试,两个线程都获得了对象锁,

* 只有当第一个执行的线程执行完毕之后,第二线程才会继续执行,保证两个线程的执行顺序,即先输出完1,才输出2

* 如果去掉关键字synchronized,两个线程互相执行,谁先抢到了资源谁就执行,即乱序。


第二个列子:

前面介绍了运用同步关键字给对象家对象锁的例子,这个例子是介绍用wait(),notify()给对象加锁的操作。

这个例子是用锁的方法实现输出1212121212,我们都知道如果没有给两个线程进行加锁,那么输出的结果就是乱序。

这个例子的思想就是:给两个线程加相同的锁,第一个进入run方法的是线程t1,之后调用notify唤醒线程,使得t2能够执行到,之后在t1执行完毕之后调用wait进行等待,这样循环下去,就保证了两个线程相互等待运行

package MultiThreed;

public class LockThread extends Thread {
	int number;
	//定义锁
	Object lock;

	public LockThread(int i, Object lock) {
		this.number = i;
		this.lock = lock;
	}

	/**
	 * 第一个进入run方法的是线程t1,之后调用notify唤醒线程,使得t2能够执行到,之后在t1执行完毕之后调用wait进行等待
	 *
	 */
	@Override
	public void run() {
		synchronized (lock) {
			for (int i = 0; i < 100; i++) {
				//lock.notify();
				System.out.println(number);
				try {
					lock.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}
		// TODO Auto-generated method stub
		super.run();
	}

	public static void main(String[] args) {
		Object lock = new Object();
		LockThread t1 = new LockThread(1, lock);
		LockThread t2 = new LockThread(2, lock);
		t1.start();
		t2.start();
	}

}

运行结果:


查看评论

C#学习之多线程开发技术(五)

线程开发       NET通过System.Threading命名空间下的类来抽象线程。其中最重要的就是类Thread,Thread类抽象了线程,它的一个对象就代表了一个线程。       当创建了...
  • HK_5788
  • HK_5788
  • 2015-10-07 11:03:22
  • 600

多线程的优势

尽管多线程编程很有挑战,但它也有自己的优势,所以仍然使用多线程技术。下面是多线程的一些优势: 更好的资源利用率 在某些情况下能简化程序设计 高响应程序 更好的资源利用率假设一个应用程序在本地文件系统中...
  • shfqbluestone
  • shfqbluestone
  • 2015-05-18 17:55:01
  • 942

强大的多线程和倒计时程序

在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java;   多线程技术是非常实用的技术,特别是碰到...
  • u010135775
  • u010135775
  • 2013-05-15 14:45:23
  • 644

intel英特尔多核_多线程技术中文版

  • 2015年07月10日 18:19
  • 6.4MB
  • 下载

理发师问题-多线程-信号量-互斥访问共享区

理发师问题,多线程,信号量
  • yilonglucky
  • yilonglucky
  • 2015-12-31 11:38:56
  • 724

多线程技术原理

首先是其继承关系如下:通过观察上面四种线程池的源码:如:newFixedThreadPool[java] view plain copypublic static ExecutorService ne...
  • Ned_mahone
  • Ned_mahone
  • 2018-04-15 09:39:57
  • 32

iOS的三种多线程技术 对比分析

1.iOS的三种多线程技术                     1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发...
  • fhbystudy
  • fhbystudy
  • 2014-04-10 17:07:17
  • 10721

稳定、方便、实用的VB6多线程技术(附老马的ActiveX多线程示例)

  • 2016年06月29日 11:47
  • 130KB
  • 下载

solaris 下多线程编程

本文遵循CPL协议,可以免费自由使用,但不得去掉作者信息。作者: 周海汉Email:ablozhou at gmail.com日期:2007.8.9 本文根据作者PPT讲稿整理。 参考资源:http:...
  • ablo_zhou
  • ablo_zhou
  • 2007-08-10 00:35:00
  • 1507

Java多线程技术研究(一)-多线程的创建及常见名词

基础做起,首先围绕Java多线程进行研究,利用博客总结自己学习的内容。 1、线程基本概念 进程:指内存中运行的应用程序,进程在执行过程中拥有独立的内存单元。当我们启动一个应用程序时,就会生成一个新...
  • guweiyu_thinker
  • guweiyu_thinker
  • 2017-05-30 14:11:38
  • 252
    个人资料
    持之以恒
    等级:
    访问量: 7450
    积分: 507
    排名: 10万+