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

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

 
阅读更多

 

多线程加锁,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();
	}
}

 

分享到:
评论

相关推荐

    linux上实现多进程和多线程实现同步互斥(源代码)

    多线程则是在一个进程中创建多个执行流,它们共享同一块内存空间,资源利用率高,但数据同步和互斥问题更复杂。在Linux中,可以使用`pthread_create()`创建线程,`pthread_join()`等待线程结束。线程间的同步互斥...

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

    Java提供了synchronized关键字来实现方法或代码块的同步,防止多个线程同时访问同一块代码。 9.7 在同步方法中使用wait(), notify和notifyAll(): 这些方法用于线程间通信。wait()使当前线程进入等待状态,直到收到...

    多线程的同步机制 VC++

    多线程同步机制在软件开发中扮演着至关重要的角色,特别是在多处理器系统或者并发执行的任务中,确保线程间的正确协作和数据一致性是必不可少的。VC++中提供了多种同步机制来处理多线程间的同步问题,其中Event是...

    C++实现多线程文件复制.docx

    C++实现多线程文件复制 在文件复制过程中,多线程技术可以大大提高复制速度。下面将详细介绍C++实现多线程文件复制的知识点。 一、多线程文件复制的基本概念 多线程文件复制是指在文件复制过程中,使用多个线程...

    c++实现多线程同步

    通过分析和学习这个示例,你可以更好地理解如何在Windows环境下用C++实现多线程同步。 总之,C++的多线程功能使得开发者能够充分利用现代硬件的并行处理能力,而信号量作为一种有效的同步工具,可以防止数据竞争,...

    java+多线程+同步详解源代码学习

    Java多线程与同步是Java编程中的核心概念,它们在构建高效、响应迅速的应用程序时起着至关重要的作用。在大型系统开发中,多线程技术使得程序能够同时执行多个任务,提高系统的并发性,而同步机制则确保了在多线程...

    Java多线程矩阵相乘的代码

    - **正确性测试**:验证多线程计算结果是否与单线程计算或已知正确结果一致。 - **压力测试**:通过改变矩阵的大小和线程的数量,观察程序在不同负载下的表现。 - **性能测试**:测量并比较多线程和单线程矩阵乘法的...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    - `synchronized`关键字可实现锁机制,保证同一时刻只有一个线程执行特定代码块或方法。 - `volatile`关键字确保线程间变量的可见性,但不保证原子性。 - `wait()`, `notify()`和`notifyAll()`方法用于线程间通信...

    易语言源码多线程类源码.rar

    2. 易语言中的线程类:易语言提供了内置的线程类,开发者可以通过创建线程对象,定义线程函数(即线程执行的代码块),然后启动线程来实现多线程。线程类通常包含创建、启动、同步和销毁线程的方法。 3. 线程同步:...

    python多线程同步之文件读写控制

    在Python编程中,多线程同步对于文件读写控制至关重要,因为如果不加以控制,多个线程同时访问同一文件可能会导致数据不一致或者错误。这里我们将深入探讨如何在Python中使用多线程同步来确保文件读写的安全性。 ...

    Linux系统下的多线程编程入门.pdf

    本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程概念 多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码...

    多线程框架通用多线程源码.zip

    此外,"大漠多线程"是一个常见的易语言多线程库,它提供了丰富的多线程操作接口,包括线程同步、互斥量、信号量等高级功能。结合"511遇见"这个标签,可能意味着这个框架是在易语言社区交流中广泛讨论和分享的成果,...

    多线程矩阵乘法C++源代码

    本示例中的"多线程矩阵乘法C++源代码"是一个典型的案例,它演示了如何利用C++语言和Windows API来实现多线程,以加速矩阵乘法运算。下面将详细解释相关知识点。 1. **C++ 多线程**: C++11及其后续标准引入了`...

    java多线程的讲解和实战

    - 同步机制:为了防止多个线程访问同一资源时产生数据不一致的问题,Java提供了`synchronized`关键字,可以锁定代码块或整个方法,确保同一时刻只有一个线程执行。 - 等待/通知机制:`wait()`, `notify()`, `...

    Java 多线程学习总结归纳(附代码)

    - 同步代码块:`synchronized(obj){...}`,锁定特定对象,确保同一时刻只有一个线程执行该代码块。 - `wait()`, `notify()`, `notifyAll()`:在同步环境中使用,用于线程间的通信和协作。 6. **线程的终止**: -...

    易语言多线程鼠标点击源码

    要实现多线程,易语言提供了“创建线程”命令,它可以创建一个新的线程并运行指定的代码块。在线程中,我们需要定义线程函数,这个函数将在线程启动后被调用。例如: ```易语言 .线程函数(参数) .开始循环 // 在...

    Windows多线程编程技术与实例-源代码

    线程同步是多线程编程中的关键问题,用于控制多个线程对共享资源的访问,防止数据竞争和死锁。Windows提供了多种同步机制,如互斥量(Mutex)、信号量(Semaphore)、事件对象(Event)和临界区(Critical Section)...

    PB多线程实现

    开发者可以创建一个工作线程对象,然后在这个对象上执行自定义的代码块。这使得在PB应用中实现多线程变得更加简单。在PB12.5中,还可以利用ThreadPool类来管理和调度多个线程,从而更有效地利用系统资源。 三、PB...

    delphi多线程参数传递及同步一

    总结来说,Delphi中的多线程通过TThread类和其派生类实现,通过构造函数传递参数,利用同步对象(如TEvent)来确保线程安全。在实际开发中,根据项目需求选择合适的同步机制和参数传递策略,可以有效提升程序的并发...

    某电信项目多线程同步数据实例

    在IT行业中,尤其是在大型系统开发中,多线程同步数据是一个关键的技术环节,尤其是在处理大量实时数据的场景,如电信项目。"某电信项目多线程同步数据实例"的标题揭示了一个具体的应用案例,它表明在该电信项目中,...

Global site tag (gtag.js) - Google Analytics