自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 问答 (2)
  • 收藏
  • 关注

原创 总结锁策略, cas 和 synchronized 优化过程

乐观锁假定数据通常不会出现并发冲突,仅在数据提交更新时,才对是否产生并发冲突进行检测。若发现冲突,会向用户返回错误信息,由用户决定后续操作。例如,在一个在线文档编辑系统中,如果多个用户同时编辑同一个文档的不同部分,乐观锁可以先让用户进行编辑,在保存时检查是否有冲突。悲观锁则总是预设最坏情况,每次获取数据时都认为他人会修改,因此每次拿数据时都会上锁,导致其他想获取该数据的线程阻塞,直至获取到锁。比如在银行系统中,处理账户资金操作时,通常会使用悲观锁来确保数据的绝对安全。

2024-07-17 17:09:09 418

原创 总结synchronized

作为 Java 中重要的同步机制,通过其丰富的特性和多样的用法,以及不同类型的锁机制,为开发者在多线程编程中提供了有效的工具,帮助解决并发问题,保障程序的正确性和性能。但在实际应用中,需要根据具体的业务场景和性能需求,合理选择和运用,以实现高效、稳定的多线程程序。希望大家在今后的编程实践中,能够熟练掌握并灵活运用,编写出更加优秀的多线程应用程序。

2024-07-15 18:18:08 925 9

原创 线程池总结

线程数的设置主要取决于业务是属于 IO 密集型还是 CPU 密集型。对于 CPU 密集型任务,其主要工作是进行大量的计算,且较少出现导致线程阻塞的情况。在这种场景下,一般将线程数设置为 CPU 核心数 + 1。例如,如果服务器拥有 8 个 CPU 核心,那么适宜将线程数设定为 9。如此一来,能够充分利用 CPU 资源,同时避免因过多线程切换而产生的额外开销。对于 IO 密集型任务,执行过程中需要大量的 I/O 操作,如磁盘 I/O、网络 I/O 等,这可能导致大量的线程阻塞。

2024-07-15 17:22:53 941 2

原创 总结单例模式的写法

饿汉模式:线程是安全的,只进行读操作懒汉模式:不安全,有读操作也有写操作单例模式的选择取决于具体需求,如是否需要懒加载、是否需要线程安全等。每种实现方式都有其适用场景和潜在问题,设计时应根据具体情况选择最合适的实现方法。

2024-07-13 18:17:36 720 6

原创 线程安全问题的原因和解决方案

在操作系统中,因为线程的调度是随机的(抢占式执行),正是因为这中随机性,才会让代码中产生很多bug 如果认为是因为这样的线程调度才导致代码产生了bug,则认为线程是不安全的, 如果这样的调度,并没有让代码产生bug,我们则认为线程是安全的。

2024-07-10 18:12:15 968 5

原创 Java 线程的几种状态

创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从 JDK1.5 开始,Java API 提供了 Executor 框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。

2024-04-27 17:32:26 1225 17

原创 Thread 类的基本用法

interrupted() 是 Java 中 Thread 类的一个静态方法,它用于检查当前线程的中断状态,并且与 isInterrupted() 方法不同,interrupted() 在检查后会清除中断状态。获取线程的实例非常的简单,就是调用Thread.currentThread()方法,因为线程的调度是不可控的,所以,这个方法只能保证实 际休眠时间是大于等于参数设置的休眠时间的。线程中断是指在多线程程序中,中断正在运行的线程的执行,通常是由其他线程通过调用目标线程的interrupt()方法来实现。

2024-04-25 20:34:06 913 11

原创 进程和线程的区别和联系

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

2024-04-22 21:47:21 939 2

原创 进程调度的基本过程

每个应⽤程序运⾏于现代操作系统之上时,操作系统会提供⼀种抽象,好像系统上只有这个程序在运⾏,所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之⼀。进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,

2024-04-21 23:16:30 584 25

原创 数据结构线性表-栈和队列的实现

从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的Vector是线程安全;根据栈先进后出的性质,结合题目中进栈的过程中也可以出栈,如A选项:1进1出,2进3进4进,4出3出2出即符合题意,同理C选项,1进2进3进3出之后不可能直接出1,故C选项不可能实现。从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安 全的。先进后出,依次入栈,依次出栈,故B选项合理。

2023-12-08 22:31:58 1301 28

原创 JAVA之异常详解

Java中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构,自定义异常通常会继承自 Exception或RunTimeException自定义异常类,然后继承自Exception或者实现一个带有String类型参数的构造方法,参数含义:出现异常的原因例如我们实现一个用户登陆功能:if (!throw new UserNameException("用户名错误!");if (!

2023-11-25 22:11:38 2599 36

原创 Java实现图书管理系统

今天与大家分享的是一个图书管理系统,这里我们运用的是的语法其中包括类和对象、继承、封装、多态、抽象类、接口还有数组等。我们需要实现一个可以进行管理员操作和用户操作的图书管理系统,其中包括了管理员操作(查找,添加,删除,显示,退出系统);用户操作(查找,借阅,归还,退出系统).

2023-11-19 19:47:41 2117 27

原创 认识继承和多态

Java 中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序里就需要考虑比如:使用 Java 语言来进行描述,就会设计出:通过观察上述代码会发现,猫和狗的类中存在大量重复,如下所示:那能否将这些共性抽取呢?。

2023-11-11 17:02:58 296 36

原创 JAVA中类和对象的认识

面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要 开发人员告诉给计算机什么是洗衣机。上图左侧就是对洗衣机简单的描述,该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知),但是 这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语 言。定义了一个类,就相当于在计算机中定义了一种新的类型。

2023-11-07 20:02:17 440 51

原创 JAVA数据类型和变量

本篇就先落笔于此,希望能给你带来帮助,如有疑惑或者不同见解,欢迎评论区留言!!!

2023-10-28 16:27:23 119 13

原创 C语言自定义类型

有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化//结构体嵌套初始化1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。int _b:5;

2023-09-30 22:54:48 215 9

原创 C语言——内存操作函数

我们前面了解到字符串操作函数(strlen,strcopy等),字符操作函数(tolower等)。这些函数的操作对象都需要符合一种指定类型,比较局限。而内存操作函数,是通过访问地址的方式操作对象,(不用担心地址存的对象类型),可应用于任何类型的对象。下面将简单介绍几种常见的内存操作函数。以上就是有关C语言进阶的内容,内存操作函数部分的模拟实现和函数使用说明及方法memcpy函数是用来进行内存拷贝的,但要注意C语言规定:该函数只要能拷贝内存不重叠的内存即可,但在有些编译器中也是可以拷贝内存重叠的内存的。

2023-09-23 17:01:35 553 29

原创 C语言指针变量作为函数参数

在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。有的时候,对于整数、小数、字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值。初学者可能会使用下面的方法来交换

2022-03-28 21:52:28 4175 6

原创 C语言指向字符串的指针

C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下:#include <stdio.h>#include <string.h>int main(){ char str[] = "http://c.biancheng.net"; int len = strlen(str), i; //直接输出字符串 printf("%s\n", str); //每次

2022-03-28 21:31:22 757 3

原创 C语言数组指针(指向数组的指针)

数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以int arr[] = { 99, 15, 100, 888, 252 };为例,该数组在内存中的分布如下图所示:定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第 0 个元素。在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:数组名的本意是表示整个数组,也就是表示

2022-03-22 21:37:58 5662 1

原创 C语言指针变量的运算(加法、减法和比较运算)

指针变量保存的是地址,而地址本质上是一个整数,所以指针变量可以进行部分运算,例如加法、减法、比较等,请看下面的代码:#include <stdio.h>int main(){ int a = 10, *pa = &a, *paa = &a; double b = 99.9, *pb = &b; char c = '@', *pc = &c; //最初的值 printf("&a=%#X, &

2022-03-21 22:19:06 1358 2

原创 C语言指针变量的定义和使用

前言数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为 指针变量。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。现在假设有一个 char 类型的变量 c,它存储了字符 ‘K’(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示)。另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们就

2022-03-21 21:43:18 646 12

原创 C语言指针是什么?

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。下图是 4G 内存中每个字节的编号(以十六进制表示):我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFF

2022-03-21 21:18:22 180 1

原创 暴力枚举总结

一、枚举基础:二、枚举的基本方法:枚举,枚举,顾名思义,就是将所有情况都举出,并判断其是否符合题目条件。所以枚举的基本方法便是分析题意后,找到一个合适的维度列举每一个元素,以完成题目。其中如何找到一个合适的维度来进行枚举便是其中的最大难点。三、枚举的基本条件:首先是时间条件。一般来说主流的OJ当中,1000ms的时间限制下可以运行操作数为10^7以内的运算(通常10^6 以内较为保险),所以在采用枚举方法之前最好看一下数据范围,确保整个程序的执行操作数不会超过106-107这个量级,如果超

2022-03-15 16:54:44 933 8

原创 C语言实现扫雷

文章目录前言一、设计思路二、12.总结前言扫雷是一款十分经典的电脑休闲单机游戏,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。一、设计思路二、12.总结...

2022-03-12 20:19:11 4290 2

原创 斐波那契数列

文章目录前言一、C语言实现:二、 青蛙跳台阶总结前言什么是斐波那契数列?斐波那契数列(Fibonacci数列)是数学家斐波那契以研究兔子繁殖为例研究的数列,故称“兔子数列”,又称为黄金分割数列。 它的一提出就受到了社会的广泛关注,经过研究之后人们发现了这个神奇的数列有着不可估量的重要作用。1,1,2,3,5,8,13…这样一个数列就是斐波那契数列。一、C语言实现:输出斐波那契数列前n个数字:1、普通算法#include <stdio.h>const int test2(void

2022-03-05 16:08:14 866

原创 【C语言】操作符详解

文章目录前言一、操作符的分类二、1.总结前言C语言中操作符不多,但是有些相同的操作符都是在不同的表达式中,有不同的解释意思,在c语言中有着必不可缺的作用,它们能使一些算法变得简单,接下来就由我来为大家详细解说。一、操作符的分类二、1.总结...

2022-03-04 14:38:09 751 1

原创 C语言——用函数方法判断闰年

文章目录一、用函数方法判断闰年二、程序代码总结一、用函数方法判断闰年1.判断输入整数是否是闰年的条件(1):该整数能被4整除但不能被100整除。(2):该整数能被400整除。2.编程思想:(1)用自定义函数判断输入的整数是否满足判断条件,然后将判断结果传回主函数中;(2)if语句的嵌套和使用;二、程序代码 #include<stdio.h> int run_year(int sun) { int i; if(sun%4==0

2022-03-03 21:43:30 11624 2

原创 C/C++实现贪吃蛇游戏

文章目录前言一、游戏效果展示二、具体项目实现1.游戏欢迎界面 welcome( )2.游戏背景 initGameScreen( )3.方块表示 int block[ ][ ][ ]总结前言俄罗斯方块(Tetris, 俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。一、游戏效果展示二、具体项目实现

2022-02-20 21:59:07 21875 8

原创 C语言三子棋

文章目录前言一、总体思路二、程序设计1.打印菜单2.开始游戏2.1创建棋盘并初始化2.2打印棋盘2.3玩家下棋2.4电脑下棋2.5判断胜负三、游戏过程演示1、玩家获胜2、电脑获胜3、游戏平局四、游戏实现的所有代码总结前言利用C语言数组、函数等一些基础知识实现与电脑对战的三子棋游戏,电脑为随机下棋。此游戏需要一定的数组、函数知识支撑。一、总体思路1.菜单界面选择开始或者退出游戏。2.创建棋盘并初始化。3.打印棋盘。4.玩家落子(玩家输入行列坐标的方式来落子),'x’表示玩家落子。5.判定胜负

2022-02-09 14:19:52 3275 4

原创 梦开始的地方

1.关于我:我叫杨万震,来自甘肃武威,是一名计算机科学与技术专业的大一学生。这是我的第一篇博客,从开始写第一篇博客开始,我将陆续记录以后学习的点点滴滴,并且想要通过自己的努力来改变自己。2.学习目标:熟练掌握C语言,Java语言。可用这些语言实现所需需求。成为一名合格的开发工程师。3.怎么学习编程: 目前通过看书和看网上的课程,日常每天多学多看,更重要的是多多的上手编程,所谓熟能生巧。学习路径则是例如b站,csdn,以及多询问老师等等。并且在牛客网刷题!一开始自己肯定不会写,就先...

2022-02-07 23:47:45 375

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除