线程

Lock锁+CAS+与Synchronized比较

▼魔方 西西 提交于 2020-03-07 03:40:33
在大学时代接触Synchronized后,做的实验就一直用它处理线程安全问题。但是我们都知道它都是块状的粒度,粗大粗大的毛孔,喷着厚重的气息,方法执行到同步块,性能抖三抖,加在方法上,就锁住了整个实例对象,静态方法上,还锁住了整个类,所有这个类的实例对象都不能避免。monitorenter和monitorexit监视器实现的同步,虎视眈眈地看着每一个蹑手蹑脚进来的线程。步步紧跟,直到执行完同步块释放锁。 Lock()是一个接口,是Java中的更加轻量级,更加灵活的,甚至可以自定义的锁,通过实现这个接口,重写它里面的 lock() ,lockInterruptibly() , tryLock() , tryLock(long time, TimeUnit unit) , unlock() , newCondition() 这几个方法,可以实现自定义锁。 源码注释解析: * { @code Lock } implementations provide more extensive locking * operations than can be obtained using { @code synchronized } methods * and statements . They allow more flexible structuring , may have * quite

Java 守护线程

…衆ロ難τιáo~ 提交于 2020-03-07 02:53:00
在 Java 中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 定义:守护线程——也称“服务线程”,它是后台线程,它有一个特性,即 为用户线程提供公共服务,在没有用户线程可服务时会自动离开。 优先级:守护线程的 优先级比较低 ,用于为系统中的其它对象和线程提供服务。 设置:通过 setDaemon(true) 来设置线程为“守护线程” ,必须在 thread.start() 之前设置。 在 Daemon 线程中产生的新线程也是 Daemon 的。 线程则是 JVM 级别的,以 Tomcat 为例,如果你在 Web 应用中启动一个线程,这个线程的生命周期并不会和 Web 应用程序保持同步。也就是说,即使你停止了 Web 应用,这个线程依旧是活跃的。 example:垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的 Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以 当垃圾回收线程是 JVM 上仅剩的线程时,垃圾回收线程会自动离开 。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。 生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。当 JVM

并发设计模式1-避免共享

假如想象 提交于 2020-03-07 02:24:59
并发问题产生条件:多个线程同时对共享变量进行读写操作。 解决并发问题,我们平时都是加互斥锁,防止同时进行读写操作,其实换个角度想, 避免共享 ,就可以了。 接下来介绍三种避免共享的三种模式: Immutability 模式、Copy-on-Write 模式和线程本地存储模式。 Immutability 模式(不变性模式) 该模式解决并发问题的思路就是让共享变量只有读操作,没有写操作。即,不变性,**就是创建对象之后,状态就不再发生变化。**变量一旦赋值就不允许赋值。 如何实现不可变性的类? 将所有的属性都设置成final; 只允许存在只读方法; 如果类的属性是引用型,该属性对应的对象也应该是不可变对象。 不可变对象的应用 其实JAVA SDK中很多类都具备不可变性,比如经常用到的基本类型的包装类Integer,String,Long,Double等,内部都实现了不可变性,其属性都是final类型的,但是你会发现一个问题, 这些类中有存在修改的方法,比如String.replace方法 ,这是怎么回事呢? String replace ( char oldChar , char newChar ) { 。。。。省略 //创建一个新的字符串返回 //原字符串不会发生任何变化 return new String ( buf , true ) ; } 它是创建了新的String对象返回

【读书笔记】《深入浅出nodejs》第三章 异步I/O

帅比萌擦擦* 提交于 2020-03-07 01:57:46
1. 为什么要异步I/O   (1)用户体验上:     并发的优势: M+N+... -> max(M,N,...) --> 使后端能够快速的响应资源     *并发的劣势:...   (2)资源分配:     单线程同步编程模型会因阻塞I/O导致硬件资源得不到更优的使用。 -> 硬件使用效率低 -----                                                | -----> Node:利用单线程,远离多线程死锁,状态同步等问题;利用异步I/O,让单线程远离阻塞,以更好的使用CPU。     多线程编程模型会因为编程中的死锁、状态同步等问题让开发人员头疼。 -> 编程上的困难 ----- 2. Node的异步I/O   (1)Node自身的执行模型 -- 事件循环 (令回调函数十分普遍)     当进程启动时,Node会创建一个类似于while(true)的循环,没执行一次循环体的过程称为一次"Tick"(“滴答”一声)。     每个Tick中,Node会:       A. 查看是否有事件待处理(什么是事件?) 事件的来源:文件I/O,网络请求       B. 如果有,取出事件以及相关的回调函数       C. 如果存在关联的回调函数,就执行他们       D. 进入下一个循环       E. A -> 没有事件了 -> 退出

如何终止线程的运行(C/C++)

点点圈 提交于 2020-03-07 01:31:21
如何终止线程的运行(C/C++) 想要终止线程的运行,可以使用以下方法: 1、线程函数返回(最好使用该方法)。 2、通过调用ExitThread函数,线程将自行撤消(最好不使用该方法)。 3、同一个进程或另一个进程中的线程调用TerminateThread函数(应避免使用该方法)。 4、ExitProcess和TerminateProcess函数也可以用来终止线程的运行(应避免使用该方法)。 下面将详细介绍终止线程运行的方法:1-4,并说明线程终止运行时会出现何种情况:5。 1、线程函数返回 始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是确保所有线程资源被正确地清除的唯一办法。 如果线程能够返回,就可以确保下列事项的实现: (1)在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。 (2)操作系统将正确地释放线程堆栈使用的内存。 (3)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。 (4)系统将递减线程内核对象的使用计数。 2、ExitThread函数 可以让线程调用ExitThread函数,以便强制线程终止运行: 函数原型: VOID ExitThread(DWORD dwExitCode); 该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类对象)将不被撤消

linux中断处理顶半部和底半部

你。 提交于 2020-03-07 01:18:04
为了平衡中断处理程序时间要求短和工作量要大的问题,linux将中断处理程序分为顶半部(top half)和底半a部(bottom half) 我们在编写服务端网络程序时往往会开启一个监听线程来专门接收客户端的请求。一旦接收到某个客户端的请求,一般不会直接在监听线程中处理客户端的请求,而是再开启一个专门处理客户端请求的线程,并在该线程中处理客户端的请求。这样监听线程就可以解脱出来处理更多的客户端请求,从而大大提高服务端程序的吞吐量。 中断处理程序和服务端网络程序类似,当硬件向内核发送中断请求时,内核(在这里内核就相当于服务端网络程序)首先会接收中断请求,这个接收中断请求的任务就是由中断处理程序的顶半部完成的。然而在顶半部中并不会执行中断处理的核心代码,而这些代码需要在底半部完成。对于顶半部来说,除了接收中断请求外,还会进行"登记工作"。也就是说要将底半部处理程序挂到发送中断请求的设备的底半部执行队列中。这样的安排,顶半部的执行速度就会很快,可以服务更多的中断请求。 如下特征的任务放在顶半部: 1、对时间非常敏感 2、与硬件相关的 3、不能被其他中断打断的工作 除了以上三点,基本考虑放在底半部。 中断底半部实现的机制有: 1.软中断softirq 2.tasklet(由软中断实现) 3.工作队列work queue 二、函数: < linux / interrupt . h > /

多线程笔记:同步机制(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中线程的通讯

岁酱吖の 提交于 2020-03-06 18:54:58
线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务。 Object类中相关的方法有两个notify方法和三个wait方法:因为wait和notify方法定义在Object类中,因此会被所有的类所继承。 这些方法都是 final 的,即它们都是不能被重写的,不能通过子类覆写去改变它们的行为。 wait()和notify()方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。   wait():使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。它不同于sleep(),当线程调用了wait()方法时,它会释放掉对象的锁。   notify(): 唤醒一个等待当前对象的锁的线程。 举个栗子:生产者和消费者之间的关系 /* 线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务. wait(): 如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。 notify():唤醒线程池等待线程其中的一个。 notifyAll() : 唤醒线程池所有等待线程。 wait与notify方法要注意的事项: 1. wait方法与notify方法是属于Object对象 的。 2.

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