线程

CAS的缺点和问题解决

▼魔方 西西 提交于 2020-03-26 11:07:20
3 月,跳不动了?>>> 在并发编程中CAS的缺点和问题,如ABA问题,自旋锁消耗问题、多变量共享一致性问题 ABA: 问题描述:线程t1将它的值从A变为B,再从B变为A。同时有线程t2要将值从A变为C。但CAS检查的时候会发现没有改变,但是实质上它已经发生了改变 。可能会造成数据的缺失。 解决方法:CAS还是类似于乐观锁,同数据乐观锁的方式给它加一个版本号或者时间戳,如AtomicStampedReference 自旋消耗资源: 问题描述:多个线程争夺同一个资源时,如果自旋一直不成功,将会一直占用CPU。 解决方法:破坏掉for死循环,当超过一定时间或者一定次数时,return退出。JDK8新增的LongAddr,和ConcurrentHashMap类似的方法。当多个线程竞争时,将粒度变小,将一个变量拆分为多个变量,达到多个线程访问多个资源的效果,最后再调用sum把它合起来。 虽然base和cells都是volatile修饰的,但感觉这个sum操作没有加锁,可能sum的结果不是那么精确。 public long sum() { Cell[] as = cells; Cell a; long sum = base; if (as != null) { for (int i = 0; i < as.length; ++i) { if ((a = as[i]) != null) sum

iOS开发多线程篇—创建线程

三世轮回 提交于 2020-03-26 09:48:56
iOS开发多线程篇—创建线程 一、创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建、启动线程 (1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 + (BOOL)isMainThread; // 是否为主线程 其他用法 获得当前线程 NSThread *current = [NSThread currentThread]; 线程的调度优先级:调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高 + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; 设置线程的名字 - (void)setName:(NSString *)n; - (NSString *)name; 其他创建线程的方式 (2)创建线程后自动启动线程 [NSThread detachNewThreadSelector:

第一篇:多线程使用

穿精又带淫゛_ 提交于 2020-03-26 09:48:00
一、创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建、启动线程 (1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 + (BOOL)isMainThread; // 是否为主线程 其他用法 获得当前线程 NSThread *current = [NSThread currentThread]; 线程的调度优先级:调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高 + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; 设置线程的名字 - (void)setName:(NSString *)n; - (NSString *)name; 其他创建线程的方式 (2)创建线程后自动启动线程 [NSThread detachNewThreadSelector:@selector(run)

Multi-thread Asynchronous Replication MAR强同步复制方案介绍

筅森魡賤 提交于 2020-03-26 01:41:10
MAR 强同步复制方案是基于 MySQL 协议的异步多线程强同步复制方案,只有当备机数据完全同步后,才由主机给予应用事务应答,保障数据不丢失。 数据库作为系统数据存储和服务的核心能力,其可用性要求非常高。在生产系统中,通常都需要用高可用方案来保证系统不间断运行,而数据同步技术是数据库高可用方案的基础。MySQL的数据复制默认是异步复制,但异步复制对于核心交易业务场景下,要求数据强一致性是不够的。 Google提供了一个半同步插件,确保必须收到一个备机的应答才让事务在主机中提交,但是当备机应答超时的情况下,半同步复制会由超时时间退化为异步,这在金融场景下风险是比较大的。按照CAP的原理,宁愿牺牲一定的可用性也不愿意把数据丢失,假设备机异常了,退化为异步了,主机继续交易。如果此时主机再发生故障,数据库层面很可能出现数据丢失,一旦数据库层面出现数据丢失,事后要去修复是非常困难的,所以这种时候我们是不让它退化,继续强同步(可能交易失败)。所以在复制这块,我们主要是去解决这两个问题。刚才讲的,而且半同步复制在跨IDC情况下性能也会有问题的。 基于MySQL协议的异步多线程强同步复制方案(Multi-thread Asynchronous Replication 简称MAR),一主两备的高可用,这两个备机是都做强同步复制的,只有当备机数据同步后,才由主机向应用返回事务应答,能够保证数据不丢不错

这么理解线程生命周期,是不是很简单?

人盡茶涼 提交于 2020-03-25 23:34:04
| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star🌟 为什么要了解线程的生命周期? 之前写过 Spring Bean 生命周期三部曲: Spring Bean生命周期之缘起 Spring Bean生命周期之缘尽 Spring Aware 到底是什么? 有朋友留言说:“了解了它们的生命周期后,使用 Spring Bean 好比看到它们的行动轨迹,现在使用就一点都不慌了”。我和他一样,了解事物的生命周期目的很简单,唯【不慌】也 Java 并发系列 已经写了很多,从来还没提起过那个它【Java线程生命周期】。有了前序理论图文的铺垫,在走进源码世界之前,谈论它的时机恰好到了。因为,编写并发程序的核心之一就是正确的摆弄线程状态 线程生命周期的几种状态 刚接触线程生命周期时,我总是记不住,也理解不了他们的状态,可以说是比较混乱,更别说它们之间是如何进行状态转换的了。原因是我把 操作系统通用线程状态 和 编程语言封装后的线程状态 概念混淆在一起了 操作系统通用线程状态

线程的等待唤醒机制;线程的生命周期;线程池;单例设计模式;Java8 接口新特性 (Java Day23)

空扰寡人 提交于 2020-03-25 23:17:33
一,线程的等待唤醒机制【线程的通信机制】 概述:就是线程和线程之间的相互沟通的通信手段。 案例:顾客来包子铺不停的吃包子 ​ 分析: 顾客:可以是一条线程 任务是吃包子 包子铺:可以是一条线程 任务做包子 包子:被线程共享资源 ​ 操作的共同资源是包子,顾客有包子开始吃,吃完了叫包子铺开始做包子,没有包子需要等待 ​ 包子铺有包子等着顾客来吃包子,吃完了开始做包子,做好了等着叫顾客吃 ​ 注意事项: 操作的是同一个资源,需要同步加锁 执行机制是抢占式, ​ 顾客有可能先抢到了要执行,没有包子 等着让给包子铺 ​ 有包子 开始吃 吃完了叫包子铺来做包子 ​ 包子铺抢到了 没有包子开始做包子,做好了把顾客叫过来吃包子 ​ 有包子等待 代码示例 //定义一个包子铺类继承Thread package com.ujiuye.demo; import java.util.ArrayList; public class Baozipu extends Thread { //定义一个存放包子的容器 private ArrayList<String> list; // 有参构造 public Baozipu(ArrayList<String> list) { super(); this.list = list; } //重写run方法指定包子铺的任务 [做包子] @Override public

这么理解线程生命周期,是不是很简单?

和自甴很熟 提交于 2020-03-25 22:37:17
3 月,跳不动了?>>> | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star🌟 为什么要了解线程的生命周期? 之前写过 Spring Bean 生命周期三部曲: Spring Bean生命周期之缘起 Spring Bean生命周期之缘尽 Spring Aware 到底是什么? 有朋友留言说:“了解了它们的生命周期后,使用 Spring Bean 好比看到它们的行动轨迹,现在使用就一点都不慌了”。我和他一样,了解事物的生命周期目的很简单,唯【不慌】也 Java 并发系列 已经写了很多,从来还没提起过那个它【Java线程生命周期】。有了前序理论图文的铺垫,在走进源码世界之前,谈论它的时机恰好到了。因为,编写并发程序的核心之一就是正确的摆弄线程状态 线程生命周期的几种状态 刚接触线程生命周期时,我总是记不住,也理解不了他们的状态,可以说是比较混乱,更别说它们之间是如何进行状态转换的了。原因是我把 操作系统通用线程状态 和 编程语言封装后的线程状态 概念混淆在一起了 操作系统通用线程状态

【MySQL】2.MySQL主从同步

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-25 21:24:19
一、MySQL主从原理 1、概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。 2、MySQL主从复制涉及的三个线程 主节点 binary log dump 线程 :当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。 从节点I/O线程 :当从节点上执行`start slave`命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。 从节点SQL线程 :SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。 对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 进程,而每个从节点都有自己的I/O进程,SQL进程

远程线程注入遇到的问题

二次信任 提交于 2020-03-25 21:07:13
前因:   远程线程注入dll的时候debug版的dll注入不成功,release版的dll成功,经过在网上查阅,最后在windows黑客编程技术详解里找到了解决办法 解决办法:    VC项目属性 →配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)   Debug模式选择"MTD",Release选择"MT"(我之前是MD也成功了)   MFC的使用”选项中设置“在静态库中使用MFC”   这个地方还没有弄很明白,如果哪位大佬有知道的还望不吝赐教 来源: https://www.cnblogs.com/ndyxb/p/12569376.html

数据库的悲观锁、乐观锁

半腔热情 提交于 2020-03-25 21:00:48
并发控制 并发情况下,需要做一些控制(一般是加锁),保证共享数据的一致性。 并发操作数据库时,需要给数据库中的数据加锁,确保数据库中数据的一致性。 数据库锁的常见分类 按使用方式来分:悲观锁、乐观锁 按锁级别来分:共享锁、排它锁(主要是这2种,当然还有其他的) 按锁粒度来分:行级锁、表级锁、页级锁 悲观锁 Pessimistic Lock 悲观的,假设是最坏的情况,认为其它线程一定会修改当前线程使用的数据库数据,当前线程一定要给使用的数据库数据加锁。 悲观锁只是个统称,并不是指某一种具体的锁。悲观锁主要包括: 共享锁(S锁,share),又称为读锁,所有线程都可以访问,但都只能读 排它锁(X锁),又称为写锁,是排它的,同一时刻只能有一个线程来访问,这个线程可对加锁的数据进行读写。 Java中的 synchronized、 ReentrantLock 等独占锁就是悲观锁思想的实现。 悲观锁一般要借助数据库本身提供的锁机制来实现。 以mysql最常用的InnoDB引擎为例:加排它锁 begin; //开始事务 select * from tb_user where id=1 for update; //给选中的行加锁 update tb_user set username='chy',password='abcd' where id=1; //修改数据 commit; //提交事务