多线程

多线程笔记:同步机制(1)

有些话、适合烂在心里 提交于 2020-03-07 00:22:25
同步机制简介 线程同步机制是一套用于协调线程间的数据访问及活动的机制,该机制用于保障线程安全以及实现这些线程的共同目标。 线程同步机制是编程语言为多线程运行制定的一套规则,合理地运用这些规则可以很大程度上保障程序的正确运行。 这套机制包含两方面的内容,一是关于多线程间的数据访问的规则,二是多线程间活动的规则。前者关乎程序运行的正确与否,是相当重要的内容;后者很大程度上是影响程序的运行效率,也是不容忽视的内容。不太严谨地说,数据访问的规则主要是由锁来实现,线程间活动的规则则表现线程调度上。 锁 线程安全问题的产生前提是多个线程并发访问共享数据,那么一种保障线程安全的方法就是将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问。锁就是利用这种思路来实现线程同步机制。 GoLang中换了个思路,通过通道(channel)来实现共享数据的安全性。 锁的相关概念 锁在编程里是个蛮有趣的概念。 锁:置于可启闭的器物上,以钥匙或暗码(如字码机构、时间机构、自动释放开关、磁性螺线管等)打开的扣件 —— 在线新华字典 特定代码的作用域或是 lock() 和 unlock() 方法之间的代码构成的区域就是“器物”的表征,线程访问其中的共享数据相当于解开“扣件”,打开了“器物”;通常所说“获得xx锁”,更像是获得了“钥匙或暗码

多线程同步:互斥量使用

老子叫甜甜 提交于 2020-03-06 23:47:40
问题: 200分,多个线程把搜集的数据各自生成txt文件,只启动一个线程添加到数据库,请指教? http://www.delphibbs.com/delphibbs/dispq.asp?lid=1233274 来自: yecloudy , 时间:2002-7-31 9:16:00, ID:1233274 [显示:小字体 | 大字体] 200分,多个线程把搜集的数据各自生成txt文件,只启动一个线程添加到数据库,请指教? 实现目的: 通过多线程把多个串口的数据添加到数据库。 实现模型: 1、启用多个线程(比如说a,b,c,d). 2、a,b,c,d各自搜集数据。把搜集的数据各自添加到对应的txt文件。(a.txt,b.txt,c.txt,d.txt) 3、假使a搜集完成,通知另一个线程e,e就把a.txt文件添加到数据库。 4、同时,假如b也搜集完成,通知e,要等e添加a.txt完后,再来添加b.txt. 请问: 1。e线程要怎么写。 2。线程a,b如何通知e,sendmessage只能用于window,有没有能通知启用线程的。 3。为了数据库不冲突,e同一个时刻只能添加某个文件的数据,所以怎么让b必须等到e在添加完a.txt再添加b.txt.(a.txt,b.txt不是特定的,谁先搜集完数据,就先。) 来自: zhliangming , 时间:2002-7-31 9:29:00,

Java自学-多线程 Lock对象

♀尐吖头ヾ 提交于 2020-03-06 21:57:27
多线程 Lock对象 与synchronized类似的,lock也能够达到同步的效果 步骤 1 : 回忆 synchronized 同步的方式 首先回忆一下 synchronized 同步对象的方式 当一个线程占用 synchronized 同步对象,其他线程就不能占用了,直到释放这个同步对象为止 package multiplethread; import java.text.SimpleDateFormat; import java.util.Date; public class TestThread { public static String now(){ return new SimpleDateFormat("HH:mm:ss").format(new Date()); } public static void main(String[] args) { final Object someObject = new Object(); Thread t1 = new Thread(){ public void run(){ try { System.out.println( now()+" t1 线程已经运行"); System.out.println( now()+this.getName()+ " 试图占有对象:someObject"); synchronized

Java8新特性--使用CompletableFuture构建异步应用

萝らか妹 提交于 2020-03-06 19:07:07
原文链接: http://www.jianshu.com/p/4897ccdcb278 Future 接口的局限性 future接口可以构建异步应用,但依然有其局限性。它很难直接表述多个Future 结果之间的依赖性。实际开发中,我们经常需要达成以下目的: 将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第 一个的结果。 等待 Future 集合中的所有任务都完成。 仅等待 Future 集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同 一个值),并返回它的结果。 通过编程方式完成一个 Future 任务的执行(即以手工设定异步操作结果的方式)。 应对 Future 的完成事件(即当 Future 的完成事件发生时会收到通知,并能使用 Future 计算的结果进行下一步的操作,不只是简单地阻塞等待操作的结果) 新的CompletableFuture将使得这些成为可能。 CompletableFuture 异步执行 首先,CompletableFuture实现了Future接口,因此你可以像Future那样使用它。 其次,CompletableFuture并非一定要交给线程池执行才能实现异步,你可以像下面这样实现异步运行。 public static void test1() throws Exception{

Java多线程的基本知识

旧时模样 提交于 2020-03-06 18:54:17
1、进程与线程 进程是指一个程序的执行过程,持有资源和线程 线程是系统中最小的执行单元,一个进程可以有多个线程,线程共享进程资源,具有同步(线程的协作)与互斥(资源的争抢) 例如:我们一个班级当做一个进程,班级里面的学生就是线程,里面的学习工具就是资源,学生们的相互协作与竞争就是线程之间的同步与互斥 2、java对线程的支持 Thead类及Runnable接口 Runnable用来定义任务 Thead控制任务执行 Runnable可以避免Thread方式由于java单继承的特性带来的缺陷,可以被多个线程(Thread实例)共享,适合于多个线程处理同一个资源的情况。 class MyThread extends Thread{ @Override public void run() { } } MyThread mt = new MyThread(); mt.start();lass MyThread implements Runnable { public void run() { }}MyThread myThread = new MyThread();Thread td = new Thread(myThread);td.start(); 3、线程的生命周期 其中阻塞事件包括:sleep、 yield、 join、wait 阻塞解除:等待或休眠时间到了 notify

C#多线程深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄 (上)

筅森魡賤 提交于 2020-03-06 18:31:13
来源CSDN博客: http://blog.csdn.net/mengsuo/archive/2008/12/06/3460106.aspx 本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而对每种方式的使用细节,适用场合不会过多解释。让我们来看看这几个类的关系图: 1.lock关键字 lock是C#关键词,它将语句块标记为临界区,确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。方法是获取给定对象的互斥锁,执行语句,然后释放该锁。 MSDN上给出了使用lock时的注意事项通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则。 1)如果实例可以被公共访问,将出现 lock (this) 问题。 2)如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题由于一个类的所有实例都只有一个类型对象(该对象是typeof的返回结果),锁定它,就锁定了该对象的所有实例

C#当中的多线程_线程基础

一曲冷凌霜 提交于 2020-03-06 18:30:56
前言 最近工作不是很忙,想把买了很久了的《C#多线程编程实战》看完,所以索性把每一章的重点记录一下,方便以后回忆。 第 1 章 线程基础 1. 创建一个线程 using System; using System.Threading; namespace Chapter1.Recipe1 { class Program { static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start(); PrintNumbers(); } static void PrintNumbers() { Console.WriteLine("Starting..."); for (int i = 1; i < 10; i++) { Console.WriteLine(i); } } } } 2. 改变线程状态的方法 ①线程暂停 -Sleep() 方法 它是 Thread 类中的一个静态方法,使用方式是 Thread.Sleep(timeout); ②线程等待 -Join() 方法 它是线程实例的一个实例方法,使用时 t.Join();(t 是线程的一个实例 ) 说明:该方法允许我们等待直到线程 t 完成,当 t 执行完成后,主线程会继续执行。借助这个方法可以简单实现两个线程之间的同步执行顺序

多线程四 案例

一曲冷凌霜 提交于 2020-03-06 14:59:37
1.阻塞式队列 生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而 通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者 要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队 列就是用来给生产者和消费者解耦的 import java . util . Random ; public class MessageQueue { private int [ ] items ; private int putIndex ; private int takeIndex ; private volatile int size ; public MessageQueue ( int capacity ) { items = new int [ capacity ] ; putIndex = 0 ; takeIndex = 0 ; size = 0 ; } public void put ( int message ) throws InterruptedException { do { synchronized ( this ) { if ( size < items . length ) { items [ putIndex

iOS 网络请求Json自动转存到CoreData(一)

余生长醉 提交于 2020-03-06 14:05:51
奉上地址一枚: GitHub 并自带demo~ 项目需求:从网络获取Json后,将Json自动转存到CoreData中。 本次任务:对CoreData封装,完成基本的增删改查,多线程操作。 我们总是在跌跌撞撞中,不断成长。 CoreDataActivity.h // // CoreDataActivity.h // QGLCoreDataPlugin // // Created by Guicai.Li on 14-10-16. // Copyright (c) 2014年 Guicai Li. All rights reserved. // #import <Foundation/Foundation.h> #import "DEBUG.h" #import "NSFetchRequest+helper.h" #import "NSManagedObject+helper.h" #import "NSManagedObjectModel+helper.h" #import "NSPersistentStoreCoordinator+helper.h" @import CoreData; @interface CoreDataActivity : NSObject // Parent Context @property (strong, nonatomic)

java高并发设计(一)--概念

可紊 提交于 2020-03-06 13:38:27
java高并发的核心,要了解并熟悉java的内存模型,并涉及相关的资源临界值。 java的内存模型围绕多线的技术要点:原子性,可见性,有序性。 原子性:原子性是指整个操作过的不可中断性,明确的说就是线程在执行过程中是顺序执行的,一旦开始操作将不受其他线程的干扰。比如对已经全局的变量进行复制的操作,每个线程都可以对其进行重新设值的操作,但是在多线程执行中,没有安全机制的情况下,不能保证其操作的原子性,有可能最终的结果不是你想看到的。所以最先的设置就是原子性。 可见性:可见性就是一个线程修改了某一个共享的变量或者资源,其他线程能够立即知道这个修改,可以参考java中的volatile关键字的效果。如果没有安全机制,一个全局变量的设置,在多线程执行下,一个线程对变量的修改对其他线程可能是不可见的,因为在多线程并发操作情况下,两个线程会同时修改该变量。 有序性:在单线程执行下,所有的代码操作计划都是顺序执行的,前面的代码总是优先执行。但是在多线程中,程序的执行顺序有可能就会出现混乱。 来源: oschina 链接: https://my.oschina.net/u/778766/blog/813196