多线程7

Delphi 7多线程编程实战与技巧 htmltable {th, td {th {pre {简介:多线程是提高应用程序性能和响应速度的关键技术,Delphi 7作为经典的Windows开发工具,提供了强大的多线程支持。文章将深入探讨如何在Delphi 7中创建和管理线程,包括理解多线程概念、使用TThread类创建自定义线程、设置线程属性、同步机制、线程间通信、优先级设置及异常处理。掌握这些技术要点对于优化高性能、高并发应用至关重要。 阅读详情

常见锁的策略

锁策略具体的情况

一.悲观锁VS乐观锁

判断条件:加锁的时候,预测当前锁冲突的概率是大还是小

预测当前锁冲突概率大,后续要做的工作往往就会更多.加锁开销就更大(时间,系统资源)=>悲观锁

预测当前锁冲突概率不大,后续要做的工作往往就更少.加锁开销就更小(时间,系统资源)=>乐观锁

synchronized是属于既是乐观锁,也是悲观锁,它支持自适应.

synchronized能够自动的统计出当前的锁冲突的次数,进行判定当前是锁冲突概率低,

还是概率高当冲突概率低的时候,就是按照乐观锁的方式来执行的.(速度更快)

当冲突概率高的时候,就会升级成悲观锁的方式来执行.(做的工作更多)

二.重量级锁VS轻量级锁

判断条件:做的事情多少,

做的事情多少叫重量级锁,做的事情少,叫轻量级锁。

一般来说,悲观锁,往往就是重量级锁加锁过程做的事情多,重量

一般来说,乐观锁,往往就是轻量级锁加锁过程做的事情少,轻量

synchronized是属于既是.重量级锁VS轻量级锁,它支持自适应.

三.自旋锁VS挂起等待锁

自旋锁
    void lock(){
        while (true){
            if (){
                continue;
            }
            获取到锁
                    break;
        }
    }

消耗了更多的cpu资源但是一旦锁被释放就能第一时间拿到锁拿到锁的速度更快,由于一直在执行这样的操作,所以一直消耗cpu。

挂起等待锁

挂起等待锁,是重量级锁的一种典型实现方式

当尝试加锁,并且锁被占用了,出现锁冲突,就会让当前这个尝试加锁的线程,被挂起.(阻塞状态)此时这个线程就不会参与调度了,直到这个锁被释放,然后系统才能唤醒这个线程,去尝试重新获取锁

(拿锁慢,节省cput的消耗)消耗的时间更长一旦线程被阻塞了,啥时候被唤醒这个过程是不可控的,可能会经历很长很长的时间。

synchronized轻量级锁部分,基于自旋锁实现;重量级锁部分,基于挂起等待锁实现.

四.可重入锁vs不可重入锁

synchronized就是可重入锁,一个线程,针对这把锁,连续加锁两次,不会死锁

不可重入锁,就会造成连续加锁两次之后会死锁。

五.公平锁炎VS非公平锁

公平锁:严格按照先来后到的顺序来获取锁哪个线程等待的时间长,哪个线程就拿到锁

非公平锁:若干个线程,各凭本事,随机的获取到锁和线程等待时间无关了。

公平锁:相当于买饭,先排队的人,先吃饭,后排队的人后买饭

非公平锁,像抢票,所有人在同一时间,一起抢票。

synchronized属于非公平锁多个线程,尝试获取这个锁

六.互斥锁VS读写锁

互斥锁:给读操作加锁:读的时候,不能写给写操作加锁:写的时候,不能读。

java的读写锁是这样设定的:

1)读锁和读锁之间,不会产生互斥

2)写锁和写锁之间,会产生互斥

3)读锁和写锁之间会产生互斥

日常开发中,有很多场景,景,属于“读多,写少”,用读写锁提高效率。

synchronized实现原理

synchronized即使悲观锁,也是乐观锁,既是轻量级锁,也是重量级锁.轻量级锁是自旋锁实现,重量级锁是挂起等待锁实现.是可重入锁,不是读写锁,是非公平锁.

synchronized 的"自适应"锁升级的过程:

1)未加锁的状态 (无锁)--->代码中开始调用执行synchronized->(2)

2)偏向锁--->遇到锁冲突

3)轻量级锁--->冲突进一步提升

4)重量级锁

偏向锁的作用:能不加锁,就不加锁,能晚加锁,就晚加锁。

就像买房子,刚开始没加锁的状态的时候,就是没买,然后跟房地产的人说,再看看,这时候就相当于偏向锁,等到有人想要买房子的时候,就会提升为轻量锁,直接将房子叫了定金,如果这时候还有很多人买,冲突加剧,就会变成重量级锁。

锁消除

最典型的,就只在一个线程里,使用synchronized.

由于编译器优化,需要保证优化后的逻辑和优化前是要等价的这里做的是比较保守的.能够起到的作用有限的。

 就是将很多的步骤合并,使其简化。

最终目的:提高效率

锁粗化

锁的粒度

加锁的范围内,,包含多少代码包含的代码越多,就认为锁的粒度就越粗反之,锁的粒度就越细。

  synchronized (this){
            fun1();
        }
        synchronized (this){
            fun2();
        }
        synchronized (this){
            fun3();
        }

合并 

 synchronized (this){
            fun1();
            fun2();
            fun3();
        }

synchronized的优化策略

1)锁升级[重要]=>高频考点.(把偏向锁,理解好,解释清楚)

2)锁消除

3)锁粗化

CAS

这是一条cpu指令,就可以完成比较和交换这样的一套操作下来(原子的)。

 boolean cas(内存地址,寄存器1,寄存器2)
    {
        if (内存地址==寄存器1){
            把  内存地址的值和 寄存器2 的值,进行交换
            return  true;
        }
        return  false;
    }

用来赋值

在java 代码中也就可以使用CAS操作了

只要代码有了加锁,此时代码就和“高性能”。

import java.util.concurrent.atomic.AtomicInteger;

public class Test5 {

        private  static AtomicInteger count=new AtomicInteger(0);
    public static void main(String[] args) {
        Thread t1=new Thread(()->{
           for (int i=0;i<5000;i++){
               count.getAndIncrement();//count++;
               count.incrementAndGet();//++count;
               count.getAndIncrement();//count--;
               count.decrementAndGet(); //--count;
               count.getAndAdd(10);//count+=10;
           }
        });

    }

}
--

此处我们的代码中,没有用到任何的加锁操作的,

这一套,基于CAS,不加锁来实现线程安全代码的方式,也称为“无锁编程

还可以基于CAS来封装成自旋锁(自旋锁也是基于CAS来实现的),

这样做,其实也就失去了“无锁编程”的意义了.

public class SpinLock{
    private Thread owner=null;//持有锁的线程是谁未加锁状态,此时owner就是null.
    public void lock(){
     while (!CAS(this.owner-->此处的比较和赋值是原子的~~就可以借助这样的逻辑来进行行加锁的实现,null-->如果当前前owner的值为null就把当前调用lock方法的线程引l用赋值到owner里面此时CAS返回true,再来!取反,就是false,循环结束了,Thread.currentThread()))
{
         
     }
    }
    public void unlock(){
        this.owner=null;
    }
}

如果当前owner不为null,此时CAS不会进行任何交换/赋值直接返回false,再来!取反,就是true,就要继续循环,再判定一次~~

CAS的ABA问题属于CAS的一个重要注意事项.

CAS 这里核心是"比较-发现相等-交换"=>潜台词发现相等=>数据中间没有发生过任何改变

此处CAS期望的是,中间没有其他线程修改过这个数据实际上,不一定.可能会出现,其他线程,把这个数据,从A->B->A看起来好像没变,好像没人改,其实是已经变过了,但是影响不大。

STM32CubeMX+Keil5实战:手把手教你用STM32F103C8T6开发扫地机器人(附完整代码) 本文详细介绍了如何使用STM32F103C8T6开发智能扫地机器人,从STM32CubeMX配置到Keil5代码实现的全过程。涵盖硬件选型、时钟树配置、GPIO外设设置、电机驱动、超声波测距及自动避障算法等核心内容,并提供完整代码示例,助力开发者快速掌握智能硬件开发技巧。 阅读详情

相关推荐

告别Qt Creator?手把手教你用VSCode+MinGW调试QT项目(附完整launch.json配置)

本文详细介绍了如何在VSCode中配置完整的QT开发环境,特别是针对使用MinGW编译器的用户。从环境搭建到调试配置,包括生成.pro文件、Makefile,以及配置task.json和launch.json文件,帮助开发者高效调试QT项目。

weixin_27180827的博客 186

PHP7多线程搭建

一直想写个爬虫,于是就用PHP写了一个,众所周知PHP并不支持多线程,所以爬行效率很低,同时运行10个进程,内存和CPU占用率很高,开大概10个进程爬行,对爬行时间还进行优化,但我的mac pro还是差不多就down掉了。 于是开始采用PHP7结合pthreads多线程工具,经测试,稳定性、效...

chongdan2839的博客 697

保姆级教程:用SOEM主站搞定汇川SV660N伺服驱动器的EtherCAT通讯(附完整C代码)

本文提供了一份详细的SOEM主站与汇川SV660N伺服驱动器EtherCAT通讯的实战教程,涵盖环境搭建、状态机理解、PDO映射配置、CiA402状态机实战、实时性能优化及诊断调试等关键步骤,并附完整C代码示例,帮助开发者快速实现工业级EtherCAT控制。

weixin_28292761的博客 301

php7多线程扩展,PHP7多线程搭建教程详解

PHP7多线程搭建教程详解一直想写个爬虫,于是就用PHP写了一个,众所周知PHP并不支持多线程,所以爬行效率很低,同时运行10个进程,内存和CPU占用率很高,开大概10个进程爬行,对爬行时间还进行优化,但我的mac pro还是差不多就down掉了。 于是开始采用PHP7结合pthreads多线程工具,经测试,稳定性、效率、内存和cpu的占用各方面都很满意。 下边就介绍PHP7的多线程环境搭建。安装...

weixin_34822215的博客 353

保姆级教程:从零到飞,用QGC地面站搞定PX4无人机全流程配置(含避坑指南)

本文提供了一份详细的QGC地面站使用教程,指导用户从零开始配置PX4无人机,涵盖固件烧录、传感器校准、遥控器设置及航点规划等关键步骤,并包含实用的避坑指南,帮助新手顺利完成首飞。

weixin_30329623的博客 219

C语言入门—初识C语言

一、C语言概述 1、什么是C语言 语言是用来交流沟通的,有一方说,有一方听。必须要两方参与。(自言自语的除外) 语言是人与人交流,而C语言是人与机器交流 语言有独特的语法规则和定义,双方必须遵循这些规则和定义才能实现真正的交流。 接下来首先了解下计算机的组成: 2、计算机介绍 2.1、计算机结构组成 2.2、计算机系统组成 2.3、程序的指令 指令是对计算机进行程序控制的最小单元 计算机的指令系统是指所有指令的集合 程序是指为完成某一项特定任务而用某种言语编写的一组指令序列 3、C语言发展历程 3.

jun319817的博客 1034

php7多线程扩展,PHP7多线程搭建

一直想写个爬虫,于是就用PHP写了一个,众所周知PHP并不支持多线程,所以爬行效率很低,同时运行10个进程,内存和CPU占用率很高,开大概10个进程爬行,对爬行时间还进行优化,但我的mac pro还是差不多就down掉了。 于是开始采用PHP7结合pthreads多线程工具,经测试,稳定性、效率、内存和cpu的占用各方面都很满意。 下边就介绍PHP7的多线程环境搭建。安装PHP7以下所有命令在ro...

weixin_42395985的博客 146

编译原理(东南大学)一:【编译原理期末冲刺救命笔记】速存!看完再上考场稳了!

本文详细介绍了编译原理的核心概念和流程,包括程序设计语言的分类、编译程序的各个阶段(如词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成)以及编译程序生成和构造的基础知识。文章还探讨了编译中的表格管理、出错处理和遍的概念,以及编译基础知识如高级语言、语法规则、字母表和符号串的运算。此外,文中还涉及文法与语言的关系,包括文法的概念、非终结符、终结符、产生式、推导和规约等。整体内容旨在为学习编译原理的学生提供全面的复习资料和考试准备指南。

一位搞嵌入式和前端的genius的博客 1027

php7 多线程 windows,PHP7多线程搭建教程

原标题:PHP7多线程搭建教程紧跟技术风向标,不迷失但也绝不落后,Go技术大全公众号正式开启,欢迎关注。 一直想写个爬虫,于是就用PHP写了一个,众所周知PHP并不支持多线程,所以爬行效率很低,同时运行10个进程,内存和CPU占用率很高,开大概10个进程爬行,对爬行时间还进行优化,但我的mac pro还是差不多就down掉了。 于是开始采用PHP7结合pthreads多线程工具,经测试,稳定性、效...

weixin_39883462的博客 248

【学习系列】SAP RAP 18:Unmanaged场景开发示例-基本数据更新

本文介绍了在SAP RAP中unmanaged模式下从0到1的开发步骤。unmanaged模式下需要自行实现数据更新、权限检查等逻辑,适用于操作现有数据库表或复杂业务场景。文章以两层的采购订单对象为例,详细说明了创建技术对象(表、视图、行为定义等)的过程,并重点阐述了如何实现CRUD相关方法的核心逻辑。通过创建缓冲类来处理交互阶段和保存阶段的数据操作,确保事务一致性。完整代码展示了抬头层级的增删改查功能实现,为后续明细层级的开发奠定了基础。

DeveloperMrMeng的博客 637

OpenCV计算机视觉实战(11)——边缘检测详解

在本节中,我们系统介绍了三大经典边缘检测算子,包括 Sobel 算子:一阶导数平衡了噪声抑制与边缘提取,结合方向信息可用于纹理分析与车道检测;Laplacian 算子:二阶导数对微小亮度突变尤为敏感,配合零交叉和细化技术,可精确捕捉任意方向的细节边缘;Canny 算法:集成多阶段处理与双阈值策略,通过多尺度融合与自适应阈值优化,达到抗噪与细节兼顾的卓越效果。

qq_30167691的博客 4375

MYSQL5.7多线程复制原理

MYSQL5.7多线程复制原理 在使用mysql的过程中,复制延迟一直是一个DBA头疼的问题。 延迟优化方法: 增大从库参数innodb_buffer_pool_size的值,可以缓存更多数据,减少由于转换导致的IO压力。 增大参数innodb_log_file_size,innodb_log_file_in_group的值,减少buffer pool的磁盘IO,提升写入性能。 修改参...

weixin_40524659的博客 1385

DeepQA: A Unified Transcriptome-Based Aging Clock Using Deep Neural Networks

摘要: 本研究针对转录组衰老时钟存在的关键局限——仅在健康样本训练导致对患病个体预测偏差的问题,提出DeepQA,一种基于专家混合架构与新型Hinge-MAE损失函数的深度学习模型。通过同时利用健康与患病个体的异质数据训练,DeepQA显著提升预测精度:在健康个体上MAE比现有方法低1.5年,且是首个能正确处理五类疾病条件的模型。其创新性体现在: 方法学突破:Hinge-MAE损失函数消除健康/患病样本的训练偏差,专家混合架构高效整合多队列数据; 流程革新:摒弃传统基因预筛选步骤,通过显著图分析直接识别衰老

qq_44050612的博客 124

Java 7之多线程

Java 7之多线程线程池 - Callable和Future Callable接口代表一段可以调用并返回结果的代码;Future接口表示异步任务,是还没有完成的任务给出的未来结果。所以说Callable用于产生结果,Future用于获取结果。     Java... 2014-02-16 18:55  9647 Java 7之多线程线程池 - 线程池原理(2) 来看

九九的专栏 774

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MySQL5.7新特性之多线程复制

文章目录MySQL5.7新特性之多线程复制一、背景1.1传统主从复制存在的问题1.2降低复制延迟的方法二、MySQL5.6的多线程复制2.1MySQL5.6多线程复制的实现2.2MySQL5.6的多线程复制的缺点三、MySQL5.7的多线程复制3.1MySQL的组提交3.2MySQL5.7多线程复制的实现四、MySQL事务提交方式及多线程复制分发4.1MySQL5.7中事务提交方式4.2多线程复制...

雪辉博客 1025

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

php7 pthreads鸡肋_php7.2安装pthreads 多线程扩展

像其他程序语言都支持了多线程~!那么PHP支持多线程吗?多线程是安全线程吗?PHP7.2 已经支持安全线程,其他版本的线程是非安全线程。php中多线程使用是需要安装扩展的,下面说一下php7.2 是怎么安装的1、下载PHP7.22、解压并进入目录wgethttp://www.xiaosongit.com/Public/Upload/file/20181118/1542458624299757.t...

weixin_39984578的博客 432

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

windows环境下PHP7.4多线程设置

pthreads已经不再支持php7.4了,需要使用新的parallel扩展,注意parallel扩展的版本一定要和php的版本对应上,大家可以直接使用本文中提及的版本。为了快速的部署PHP环境,我直接使用了小皮,但是小皮并不是关键因素,只是用它快速提供了apache.本文所使用软件如下图。windows环境下的PHP设置多线程时有一定的难度,难点主要是PHP版本的选择,多线程扩展的选择,以及相关的设置等。如果出现下图的输出说明你的windows下的php7.4的多线程就配置好了。路径添加到系统路径中。

alfiy的专栏 1474

windows phone7中多线程实例

windows phone 7中的多线程与windows中的多线程编程没什么区别,参照C#中thread类的用法,很容易实现多线程。 我遇到的问题是:wp7需要从音频口读取单片机传过来的数据(详见前面的博客),同时利用右声道向外播放声音(特定的波形),从而为单片机板子供电(供电这块还不知道好不好使,目前只是做手机这边,看能不能发出波形来)。 之前测试过了,录音的程序好使,需要做的就是在这个程序

toddhan的专栏 3721

5.7mysql 多线程slave

5.7mysql 多线程slave 1.主库需要设置参数: server_id=202 log-bin=mysql-bin binlog_format=row log-slave-updates sync_binlog=1 innodb_flush_log_at_trx_commit=1 2.从库配置 server_id=203 log-bin=mysql-bin binlog_format=row log-slave-updates slave-parallel-type=LOGICAL_CLOCK s

sinat_36355775的博客 1372

HashMap 在 1.7 多线程下死循环问题深度剖析

HashMap 在 1.7 版本中的底层数据结构是数组加链表。当数组进行扩容时,会涉及到链表的数据迁移操作,而死循环问题就出现在这个迁移过程中。在 JDK 核心发布中,HashMap 在 1.7 版本下数组扩容时,由于链表采用头插法进行数据迁移,在多线程环境下可能导致死循环。例如,有两个线程,线程 1 读取 HashMap 数据准备扩容时,线程 2 介入并先进行扩容(头插法导致链表顺序颠倒),然后线程 1 继续执行就会产生死循环。在 JDK 8 中对扩容算法做了调整,采用尾插法,避免了这个问题,如迁移前是。

m0_57836225的博客 841

python2.7异步_Python2.7实现多进程下开发多线程示例

简单的基于Python2.7版本的多进程下开发多线程的示例,供大家参考,具体内容如下可以使得程序执行效率至少提升10倍#!/usr/bin/env python# -*- coding: utf-8 -*-"""@Time : 2018/10/24@Author : LiuXueWen@Site :@File : transfer.py@Software: PyCharm@Description:...

weixin_39793319的博客 971

mysql 5.7 多线程复制_MySQL5.7的AB复制以及 GTID多线程复制 配置

mysql AB复制:三台主机:MASTER IP:172.25.35.21SLAVE1 IP:172.25.35.22SLAVE2 IP:172.25.35.19MYSQL版本:mysql5.7下载安装包mysql-community-client-5.7.11-1.el6.x86_64.rpmmysql-community-common-5.7.11-1.el6.x86_64.rpmmysql...

weixin_39692271的博客 143

php7 pthreads鸡肋_php7支持多线程pthreads

1、安装多线程库:cd /usr/local/services/php-7.0.7/bin/pecl install pthreads或手动编译安装:wget http://www.xxx.com/pecl.php.net/get/pthreads-3.1.6.tgztar -zxvf pthreads-3.1.6.tgzcd pthreads-3.1.6/usr/local/services/p...

weixin_39565021的博客 427

Delphi7 多线程测试40个线程:提升多线程编程效率的利器

Delphi7 多线程测试40个线程:提升多线程编程效率的利器 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 Delphi7环境下实现40线程并发测试,探索多线程编程效率。 项目介绍 在多线程编程领域,Delphi7以其稳定的性能和高效的并发处理能力,一直受到开发者的青睐。今天,我们将为您介绍一个在Delphi7环境下进行的40线程并发测试项目。该项目不仅展...

gitblog_06762的博客 838

Delphi7 多线程测试(40个线程)

Delphi7 多线程测试(40个线程) 去发现同类优质开源项目:https://gitcode.com/ 此资源文件为Delphi7环境下进行的40线程并发测试项目。在项目中,我们成功开启了40个线程,且各个线程之间互不影响。支持动态暂停和结束线程操作,但观察到一个有趣的现象:当40个线程同时运行时,总体完成时间较单个线程运行要慢,具体原因尚待探讨。 项目特点 支持在Delphi7环境下创建4...

gitblog_06749的博客 470

手把手教你使用php7,PHP7多线程搭建教程

一直想写个爬虫,于是就用PHP写了一个,众所周知PHP并不支持多线程,所以爬行效率很低,同时运行10个进程,内存和CPU占用率很高,开大概10个进程爬行,对爬行时间还进行优化,但我的mac pro还是差不多就down掉了。 于是开始采用PHP7结合pthreads多线程工具,经测试,稳定性、效率、内存和cpu的占用各方面都很满意。 下边就介绍PHP7的多线程环境搭建。安装PHP7以下所有命令在ro...

weixin_39637723的博客 439
上一篇: 多线程6
下一篇: 多线程8
鱼裤
博客等级 码龄4年 678粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼裤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值