线程

Linux下线程pthread以及锁的一些总结和代码参考

大城市里の小女人 提交于 2020-03-01 04:58:55
对于linux下线程pthread的认识以及锁的相关概念等等,作为小白的我推荐这一篇比较好的文章,也谢谢大牛的分享: http://casatwy.com/pthreadde-ge-chong-tong-bu-ji-zhi.html 对于只使用基本mutex的同学,摘录文章中的一段话,共同勉励,一起养成良好的编码规范: 如果要进入一段临界区需要多个mutex锁,那么就很容易导致死锁,单个mutex锁是不会引发死锁的。要解决这个问题也很简单,只要申请锁的时候 按照固定顺序,或者及时释放不需要的mutex锁就可以。这就对我们的代码有一定的要求,尤其是全局mutex锁的时候,更需要遵守一个约定。 如果是全局mutex锁,我习惯将它们写在同一个头文件里。 一个模块的文件再多,都必须要有两个umbrella header file。一个是整个模块的伞,外界使用你的模块的时候,只要include这个头文件即可。另一个用于给模块的所有子模块去include,然后这个头 文件里面就放一些公用的宏啊,配置啊啥的,全局mutex放在这里就最合适了。 这两个文件不能是同一个,否则容易出循环include的问题。如果有人写 模块不喜欢写这样的头文件的,那现在就要改了。 然后我的mutex锁的命名规则就是: 作用_mutex_序号 ,比 如 LinkListMutex_mutex_1 ,

图示JVM工作原理

淺唱寂寞╮ 提交于 2020-03-01 04:05:24
JDK,JRE,JVM的联系是啥? 不格网 m.vbuge.com JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很清楚 JVM的作用是啥? JVM有2个特别有意思的特性,语言无关性和平台无关性。 语言无关性是指实现了Java虚拟机规范的语言对可以在JVM上运行,如Groovy,和在大数据领域比较火的语言Scala,因为JVM最终运行的是class文件,只要最终的class文件复合规范就可以在JVM上运行。 平台无关性是指安装在不同平台的JVM会把class文件解释为本地的机器指令,从而实现Write Once,Run Anywhere JVM运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域 其中方法区和堆是所有线程共享的数据区 程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区,画一个逻辑图 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器

java:synchronized

徘徊边缘 提交于 2020-03-01 03:19:16
synchronized :利用上锁实现数据同步,避免多线程操作的情况下,数据出现异常。 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 一个线程获得了一个对象的同步锁,那这个对象上所有被同步的代码都不能执行,但不影响其他非同步代码。 在代码块前加上 synchronized关键字,则此代码块就成为同步代码块, 同步代码块:明确锁住对象 synchronized(同步对象){ 需要同步的代码; } 同步方法,跟同步代码块的功能类似:锁住的对象是this public synchronized void fun1(){ ... } 实例: class MyThread implements Runnable { int i = 100; public void run(){ while(true){ //并不是锁止状态,t1,t2同时进入 System.out.println("-------------"+Thread.currentThread().getName()); synchronized(this){ //如t1锁住,就算t2抢到cpu也进不去 System.out.println(Thread.currentThread().getName() + i); i--; if(i<0){ break; } } } } } class Test {

锁和synchronized

与世无争的帅哥 提交于 2020-03-01 03:16:54
锁的常见概念 互斥: 同一时刻只有一个线程执行 临界区:一段需要互斥执行的代码 细粒度锁: 用不同的锁对受保护资源进行精细化管理。 细粒度锁可以提高并行度,是性能优化的一个重要手段 死锁 :一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象 。 用锁的最佳实践 永远只再更新对象的成员变量时加锁。 永远只在访问可变的成员变量时加锁。 永远不再调用其它对象的方法时加锁。 减少所得持有时间,减小锁的粒度。 同步与异步 调用方法如果需要等待结果,就是同步;如果不需要等待结果就是异步。 同步是Java代码默认的处理方式。 如何实现程序支持异步: 异步调用: 调用方创建一个子线程,再子线程中执行方法调用。 异步方法: 被调用方;方法实现的时候,创建一个显得线程执行主要逻辑,主线程直接return。 synchronized class X{ //修饰非静态方法 synchronized void foo(){ //临界区 } //修饰静态方法 synchronized static void bar(){ //临界区 } //修饰代码块 Object obj = new Object(); void baz(){ synchronized(obj){ //临界区 } } } Java编译器会在synchronized修饰的方法或代码块前后自动加上加锁lock()和解锁unlock()

Java并发编程--2.synchronized

六眼飞鱼酱① 提交于 2020-03-01 03:14:54
前言 synchronized关键字是互斥锁,也称为内部锁 每个对象都有自己的monitor(锁标记),它是为了分配给线程,最多一个线程可以拥有对象的锁 使用 synchronized修饰成员方法,锁的是当前实例对象 下面是一个例子: class Thread2 implements Runnable{ private int count; //修饰成员方法,锁的是调用它的对象,该例中也即是调用它的线程 public synchronized void run() { for (int i = 0; i < 5; i ++) { try { System.out.println(Thread.currentThread().getName() + ":" + (count++)); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } 调用: Thread2 t2 = new Thread2(); new Thread(t2).start(); new Thread(t2).start(); synchronized修饰静态方法,锁的是该类的Class对象 下面是一个例子: class Thread3 implements Runnable { private

Java Thread系列(五)synchronized

南笙酒味 提交于 2020-03-01 03:14:28
Java Thread系列(五)synchronized 本文我们讨论 synchronized 重量级锁的实现原理。 一、synchronized 实现原理 1.1 synchronized 修饰符对应的字节码指令 我们知道在 java中synchronized 主要有两种使用形式:同步方法和同步代码块。 synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。Java 中每一个对象都可以作为锁,这是 synchronized 实现同步的基础: (1)普通同步方法,锁是当前实例对象 (2)静态同步方法,锁是当前类的class对象 (3)同步方法块,锁是括号里面的对象接下来 public class SynchronizedTest { // 作用于类级别 public synchronized static void testClass() { System.out.println("synchronized testClass!!!"); } // 作用于方法级别 public synchronized void testMethod() { System.out.println("synchronized testMethod!!!"); } // 作用于代码块级别 public void

synchronized细节问题(二)

橙三吉。 提交于 2020-03-01 03:12:07
使用synchronized声明的方法在某些情况下是有弊端的,比如A线程调用同步的方法执行一个很长时间的任务,那么B线程就必须等待比较长的时间才能执行,这样的情况下,可以使用synchronized代码块去优化代码执行时间,也就是通常所说的减小锁的粒度。 synchronized可以使用任意的Object进行加锁,用法比较灵活。 另外特别注意一个问题,就是不要使用String的常量加锁,会出现死循环问题。 锁对象的改变问题,当使用一个对象进行加锁的时候,要注意对象本身发生改变的时候,那么持有的锁就不同。如果对象本身不发生改变,那么依然是同步的,即使是对象的属性发生了变化: demo: public class ModifyLock { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public synchronized void changeAttributte(String name, int

Java多线程学习(二)synchronized关键字(1)

时间秒杀一切 提交于 2020-03-01 03:10:17
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二) 将分为两篇文章介绍 synchronized同步方法 另一篇介绍 synchronized同步语句块 。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多线程学习(四)等待/通知(wait/notify)机制 系列文章将被优先更新与微信公众号 “Java面试通关手册” ,欢迎广大Java程序员和爱好技术的人员关注。 (1) synchronized同步方法 本节思维导图: 思维导图源文件+思维导图软件关注微信公众号: “Java面试通关手册” 回复关键字: “Java多线程” 免费领取。 一 简介 Java并发编程这个领域中 synchronized关键字 一直都是元老级的角色,很久之前很多人都会称它为 “重量级锁” 。但是,在JavaSE 1.6之后进行了主要包括为了 减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁 以及其它各种优化之后变得在某些情况下并不是那么重了。

细说Java GUI:AWT,SWT,Swing

吃可爱长大的小学妹 提交于 2020-03-01 03:09:21
历史 Internet上有许多围绕这一争论的故事。你可能已经听说过它们中的大多数了,其中之一有助于让你理清头绪,让我们就从这里开始,Amy Fowler是Swing阵营的一个倡导者。 回到上个世纪90年代,曾几何时有3家庞大的Smalltalk公司——IBM、Parc-Place和 Digitalk。在90年代初期3家公司的市场份额大致相等,生活是美好的。Parc-Place采用仿窗口部件(emulated widgets)的设计(即Swing的设计),IBM和Digitalk则采用原生窗口部件(native widgets)。后来IBM压倒了另外两家,因此他们打算合并成一家,假设叫做Parc-Place Digitalk。随后当他们试图将他们的产品融合到一个叫做Jigsaw的计划中时爆发了一场大战,计划由于政治原因失败了(开发人员实际上已经能让它运转起来),就因为原生和仿造两派的死战。 Amy赢得了精神上的胜利,不过IBM赢得了他们所有的生意,因为这两家公司在一整年里除了吵架什么都没做。当尘埃落定之后PPD(Parc-Place Digitalk当时已改名为Objectshare,跟Windscale改名为Sellafield的原因相同——让人们淡忘之前发生的灾难)的股票价格从60美元掉到了低于1美元1股。他们因为伪报收入被NASDAQ摘牌,从此消失。 当时,AWT已经出现了

SetWindowsHookEx的用法

馋奶兔 提交于 2020-03-01 02:46:21
HOOK钩子详细介绍 基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监 视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理 window消息或特定事件。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有 到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强 制结束消息的传递。 运行机制 1、钩子链表和钩子子程: 每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针 指向指定的,应用程 序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。 一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始, 而最早安装的钩子放在最后,也就是后加入的先获得控制权。 Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表