㈠ c++编程错误列表及解决方案
C++常见编译/链接错误及其解决办法
1. 解决error LNK2005: ___crtExitProcess 已经在 LIBCMTD.lib(crt0dat.obj) 中定义
有的时候, 在 Debug 模式下编译没问题, 换到 Release 模式就发生一堆问题.
典型的例子, 就是因为 c++ runtime library 设定不同, 所造成的重复定义连结错误.
而另一个常见的例子是 专案与 library 使用不同的字符集合设定
(如: 一个用 Unicode Character Set, 另一个用 Multi-Byte Character Set)
这个错误发生原因, 有可能是
1. 你 link 的 lib 使用 C++ Multi-threaded DLL (/MD)
2. 而你的 source 使用的 C++ runtime library 是 Multi-threaded (/MT)
导致重复定义
解决方法:
两个使用相同的 C++ runtime library.例如都使用 static 的 Multi-threaded (/MT).
2. 错误 1error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义 MSVCRTD.lib
项目 -> 属性 -> c/C++ -> 代码生成 -> 运行时库 设置为: 多线程调试 DLL (/MDd)
被引用的库和调用的程序编译选项不同,需要改成一致后编译
3.#pragma once与 #ifndef的区别
为了避免同一个文件被include多次
1 #ifndef方式
2 #pragma once方式
在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif
方式二:
#pragma once
... ... // 一些声明语句
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
方式一由语言支持所以移植性好,方式二 可以避免名字冲突
4.error LNK2019: 无法解析的外部符号 __imp__PathCombineW
PathCombine是Shell api 需要引入库#pragma comment( lib, "shlwapi.lib")
5.error C2662: "MyClass::GetName()”: 不能将“this”指针从“const MyClass”转换为“MyClass &”
bool MyClass::operator==(const MyClass* n1) const
{return GetName() == n1->GetName();}
原因是不能在const函数中调用对象的非const方法,MyClass中的GetName()必须是const的。
6.template 模板
模板声明和定义必须在同一个文件中,而且只有实例话模板类型时才编译模板实例
7.error C2275: “MyClass”: 将此类型用作表达式非法 MyClass.Instance();
原因:Instance是静态方法,用.引用会出错。应该是MyClass::Instance()
8.error LNK2019: 无法解析的外部符号 "public: __thiscall MyClass(void)
原因:只声明了构造函数,MyClass(); ,但未定义。 可以定义空函数,或者直接注释掉,使用默认构造函数。
9.error C2504: “testing”: 未定义基类
class PackToolTest : testing.Test {}
原因:Test是testing命名空间下的一个类,需要用域操作符,testing::Test
还有一个问题,缺少基类继承权限(public、protected、private)
10.error C2864: “MyClass::_nullpack”: 只有静态常量整型数据成员才可以在类中初始化
class MyClass {string _nullpack = "test";}
原因:c++ 中,成员变量不能在声明时初始化,而是在构造函数初始化列表中先初始化
11.error LNK2019: 无法解析的外部符号_WinMain@16int main()
原因:由于创建的是Win32 Project,和Win32 console Project的链接库不同
方法1:在程序最开始的地方加上以下语句
#pragma comment(linker, "/subsystem:console ")
方法2:project > > setting > > 在link 的project options 中将/subsystem:windows(console)删了
12.类似“已经在 msvcprtd.lib(MSVCP80D.dll) 中定义”问题
vs2005 Debug /Release需要分别配制
分析一下错误来源,会发现:
1. 错误来源主要是重复定义的问题,而且重复定义的基本上都是VC Runtime和Standard C++ Library中的函数
2. LIBCMT和LIBCPMT为Release下的Lib,本来不应该出现在Debug版本的链接的Lib中
3. 重复定义的问题主要出现在:LIBCMT, LIBCPMT, MSVCPRTD, MSVCRTD
来看看出问题的LIB是那些:
1. LIBCMT:C Runtime库的多线程静态链接的Release版本
2. LIBCPMT:C++ Standard Library的多线程静态链接的Release版本
3. MSVCPRTD:C++ Standard Library的多线程DLL的Debug版本
4. MSVCRTD:C Runtime Library的多线程DLL的Debug版本
当 前我们的配置是多线程DLL的Debug版,因此3和4是应该出现在link的列表中的,不属于多余。而后两者则是只是当多线程静态链接Release版 中才会出现。这提示我在项目中加入的ANTLR.LIB可能是造成这个问题的根源,因为静态库的编译选项很容易和主程序发生冲突,并且根据实际信息我们可 以看出ANTLR.LIB应该是用多线程静态链接的Release版本来编译的。
解决方法:
1、首先查看编译项目依赖的其他项目的运行时库是否一致
2、如果不一致,改为同样的运行时库,如在下编译的是:“多线程调试 DLL (/MDd)”,现在需要把所有的依赖项目的运行时库都改为一致的库,就OK了。
13.error C2143: 语法错误 : 缺少“;”(在“*”的前面)
原因:产生错误处,某类型未include,可能头文件名拼写错误、头文件名已更改
14.error C2572: “MyClass::Invoke”: 重定义默认参数 : 参数 2
string MyClass::Invoke(const CParam& paraObj, INVOKETYPE type = ASYN)
原因:默认参数,只需在声明时指定。方法定义的时候无需指定默认参数。
string MyClass::Invoke(const CParam& paraObj, INVOKETYPE type /*= ASYN*/)
{ ... }。。。。。
希望对你有用
㈡ 在android4.0.几的版本上会出现这个问题,在线求解答
看不见
㈢ C++多线程编程问题
多线程工作可以提高解决问题的速度
你举得例子可以多线程实现,但是更多的人称之为分布式计算
多线程主要是创建多个线程,每个线程负责自己的事情,每个线程只对主线程负责
至于解决问题的速度应该可以达到提高一半,但是你要注意资源的互斥,互斥处理不好估计会事倍功半
㈣ java的多线程和CPU
CPU对于各个线程的调度是随机的(分时调度),而在Java中,JVM负责线程的调度,可更好地分配CPU的使用权。对于线程的调度一般有两种模式,分时调度和抢占式调度。分时调度是按照顺序平均分配;抢占调度是按照优先级来进行分配。
㈤ 为什么多线程,junit 中无法使用spring 依赖注入
因为spring为了考虑安全性问题,在多线程情况下,不支持直接使用@Resouce注解方式进行直接的bean注入,那么也就是说,如果在多线程调用该注入实例化的变量时,将会报NullPointerException。
解决法:多线程情况下,通过调用的service进行传入需要操作的bean变量,而多线程只是将前台工作转移到后台。
如下:#CalculateServiceImpl.java服务实现,传入需要调用的bean
㈥ 什么是matlab多线程编程
一直到 MATLAB 7.4 (R2007a)之前,MATLAB都是不支持多线程、多处理器的。并且到现在为止,MATLAB本身还是一个单线程的应用程序。随着多处理器的普及,从MATLAB 7.4 (R2007a)以后,MathWorks公司发布了Parallel Computing Toolbox ,用来发挥多处理器的功能(注意:多处理器与多线程有着明显的区别,单处理器上也可以实现多线程,比如说JAVA, C++等语言)。
可能的原因(有些是我个人的观点、非MathWorks公司的文献):使用MATLAB的用户,一般用作处理大量的数据、画图、模拟等。我们知道,对于这些应用,数据之间的依赖性(dependency)特别高,学过computer science的用户可能知道,当数据之间的依赖性特别高时,多线程的优点几乎体现不出来,因为一个线程的执行,必须等另外一个线程结束才可以。
随着Parallel Computing Toolbox工具箱的发布,很多大学开始建立Parallel Computing Toolbox实验室(比如说新加坡南洋理工大学,该实验室里使用100多台电脑来做Parallel Computing Toolbox,帮助研究人员处理海量数据),MATLAB通过Parallel Computing Toolbox,可以把任务分配给多个worker(可以理解为一个处理器,但不等同)。根据我个人的使用经验,使用Parallel Computing Toolbox处理海量数据,有着非常明显的优势。
㈦ mplayer 是多线程处理的吗
gentoo安装和使用进行了将近一天的惊心动魄的升级后(很庆幸系统没有挂掉,而且感觉更快了),终于想静下心来把一个星期以来的安装、配置以及升级gentoo大致写出来,一是想纪念一下,另外也许对其他想用gentoo的朋友有一些参考价值。我使用linux不算很长,大概用了一年半的ubuntu和一年的archlinux。用archlinux时逛论坛经常有人谈及gentoo,好像用 gentoo的都是高手。当时感觉可笑,各各发行版区别都那么大吗,之前用ubuntu转到archlinux也就是显卡驱动那碰到点问题,其他都比较顺 利,gentoo又能难到哪去呢?另外gentoo安装软件都是要编译的,我的本性能也不好,就想如果以后换了新的再考虑吧,所以中间虽然想了几次,但一 定没有尝试。一个星期前(2010 3月4号),我把mplayer和ffmpeg都手动升级下,发现编译起来有点纠结,mplayer需要ffmpeg的源码,但ffmpeg还要单独编 译,后来让mplayer用ffmpeg的so后升级ffmpeg后mplayer居然挂了,重编了几回才弄好。系统里有好几个包都自己编译,主要是想去 掉不用的依赖,但手动维护太麻烦了,于是又想到了gentoo。当时已经10点多了,于是想第二天开始着手。废话完毕。 www.dnjsb.com 之前的硬盘分区就这样的:/dev/sda1 ext4 6g //dev/sda2 2g 未使用/dev/sda3 ntfs 30g/dev/sda4 jfs 66g /home其中/dev/sda2是以前的swap,但后来不用休眠功能后感觉swap意思不大,就不用了。其余的三个分区都比较重要,基本动不得,这给怎么装啊。想来想去,先用sda2试试吧,如果装不上就没事了,装上再进一步考虑吧。于是把sda2格成了reiserfs(某人说这种格式好,但我从来没用过,正好体验一下)。下载 stage3-i686-20110301.tar.bz2 和portage-latest.tar.xz。(前一个文件一周一更新)(我用的32位)国内的镜像有:http://mirrors.163.com/gentoo/http://mirrors.sohu.com/gentoo/http://mirror.bjtu.e.cn/gentoo/http://mirrors.xmu.e.cn/gentoo/这两个文件可以在里边找。把sda2挂在/media/z上,并把文件放进去:sudo mount /dev/sda2 /media/zsudo tar xvpf stage3-i686-20110301.tar.bz2 -C /media/zsudo tar xvpf portage-latest.tar.xz -C /media/z/usr准备chroot环境:sudo mount -t proc none /media/z/procsudo mount -vt devpts devpts /media/z/dev/ptssudo chroot /media/z/ /bin/bash现在就chroot进去了,之后的操作如不特别说时都是在这个环境下进行的。 www.dnjsb.com 初始化环境变量:env-update;source /etc/profile修改/etc/make.conf,这个非常重要,最好首先改到位,不然之后有你受的(我就是,不得要领,改了多回,改完还要重编译各种东西):加入源:GENTOO_MIRRORS=http://mirror.bjtu.e.cn/gentoo/SYNC=rsync://mirror.bjtu.e.cn/gentoo-portage上边那四个网站都有说明如何写这个。MAKEOPTS=-j3 #-jn,n是内核数加1,多线程编译用的,不设置也行INPUT_DEVICES=keyboard mouse synaptics #键盘、鼠标、触摸板#下面的是很重要的USE,开始时可以只用USE=X gtk,但最开始写好以前就省事了,不然以后会麻烦重重。USE=-pppd -alsa -fortran sse sse2 ssse3 mmx sdl v4l v4l2 oss oss4 X gtk unicode truetype jpeg png gif cairo zsh-completion fontconfig videoopenglVIDEO_CARDS=radeon #这个至关重要,显卡驱动类型,具体请查看官方wiki,我的是ati x2300,只能用这个开源驱动。#CCEPT_KEYWORDS=~x86 #这个要注意,如果要用最新的软件,可以加上这行,但如果是第一次装,强烈不建议加,不然会提升安装难度先改这些就差不多了。改/etc/locale.gen,加(按照自已需要写)en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8zh_CN.GB2312 GB2312zh_CN.GBK GBK运行locale-gencp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改/etc/conf.d/clockCLOCK=localTIMEZONE=Asia/Shanghai改/etc/resolv.conf,把本机的/etc/resolv.conf内容写出其中,不然上不了网。改/etc/fstab,这个也可以安装完内核再写,这个应该都会写。查看网络是否正常(如果电脑联网了,resolv.conf也改了就可以上了),然后同步portage(如果portage-latest.tar.xz是刚下的也可以略过这步,但最好还是运行下吧):emerge --sync安装内核源码:emerge gentoo-sources下边就开始编译内核了,如果有手动配置内核的经验强烈建议手动配置编译:cd /usr/src/linuxmake menuconfigmake; make moles_installcp arch/x86/boot/bzImage /boot,不然最好使用genkernel:emerge genkernelcd /usr/src/linux/genkernel --menuconfig all关于配置内核请上网自行查询,如果下一种方式实在不会也可以不配置,一般也能启动起来。编译时间和很多因素有关,几十分钟到几小时不等。用户相关:(osily是自己要创建的用户名)passwseradd -m -G audio,cdrom,portage,usb,video,wheel,users -s /bin/bash osilypasswd osily如果fstab之前没改好现在一定要改好,然后改自己系统的/boot/grub/menu.lst。此处官方wiki写的很清楚,建议查看。 www.dnjsb.com 现在可以继续安装其他软件,如xorg-server,但最好还是重启看看能不能进去。如果不能的话多半是内核(尤其是自己编译的内核)的问题,如果内核没问题,看看/boot/grub/menu.lst是不是有问题,多改几回。如果可以正常进去的话,可以直接在这继续编译,但最好还是返回原来的系统继续。可以写个类似这样的脚本:#!/bin/bashsudo mount /dev/sda2 /media/z/sudo mount -t proc none /media/z/procsudo mount -vt devpts devpts /media/z/dev/ptssudo chroot /media/z/ /bin/bash运行就可以进去chroot环境,如果进去环境变量不正常运行:env-update;source /etc/profile然后就是安装需要的东西了,主要看自己了,比如dhcpcd、sudo、vim,一般的工具直接emerge xxx就可以了,emerge的具体用法网上查吧。但如果你想要桌面环境的话,最好按以下的步骤:安装点基本工具后,直接安装xorg-server,注意前提/etc/make.conf里显卡和输入设备等变量一定是正确的。这会安装许多东西,基本要用一个小时以上,耐心等待吧。安装完后:(xorg-x11和驱动相关,请查看官网wiki相关部分,这部好像可以省略,记不清了) www.dnjsb.com eselect opengl set xorg-x11如果安装好了,可以先重启试试,进去后,运行startx,这是很刺激的一刻了,如果显示找不到xterm找不到什么的,恭喜你,显卡驱动基本正常了,不 然就会有各种稀奇古怪的问题&&×&%×&,那么也恭喜你,在接下来的时间你将对安装显卡驱动、写 xorg.conf等有深刻而透彻的了解。如果是前者,你可以回去继续安装其他东西,如xterm(最好安装完再重启下看看是不是正常,如果不正常,那么你可以回过头处理显卡驱动问题了)、openbox甚至gnome、kde。下文再说。如果是后者或者刚才的xterm显示分辨率不对、鼠标键盘触摸板不能用,那么你要折腾一会了,虽然之前安装内核没有难到你,这里很可能让足够纠结甚至放弃。这也是我安装过程中最混乱的地方,已经没法清晰地回忆了,因为这的问题我先后重装了4次,(第一次因为2g空间不够,2、3次都因为X段错误,非常纠结),而且其中改了几回显卡驱动类似,重编译了多回。如果是X段错误,看出错信息是不是加载某个so出的错,如果是可以先把那个so移到别的地方重试。如果不是段错误,可能是xorg.conf有问题,有的驱动是不需要这个问题的,默认也是没有了,所以如果有先删掉试试,不行的话用X -configure生成一个新的再X -config xorg.conf.new尝试如果不行的话,还很有可能是内核没配置的问题,这往往比较麻烦,可以先仔细阅读官网wiki,不行再去linuxsir等论坛去找找或者问问。重编译内核后最好把和X相关的包也重编译下(有许多)。再有很可能是你选择的驱动不支持你的显卡,比如老的ati显卡很多都不能用现在的闭源驱动。这样可以试试其他的,改/etc/make.conf,然后必须把相关的包重新编译。还有其他的可能吧如果xterm能进去了,但鼠标键盘等不能用,保证/etc/make.conf正确的话,安装xf86-input-evdev,如果xf86-input-keyboard xf86-input-mouse xf86-input-synaptics 没有的话说明/etc/make.conf没写对,这时安装上这几个包也未必好用,可能要重新编译更多包。这个问题应该是比较好解决的。如果分辩率不正常,首先要确认用的不是xf86-video-vesa的驱动(按我的流程不会安装到这个包),如果是那很可以分辨率就不调不正常了。然后还是显卡驱动安装问题,还有xorg.conf,上网多找找吧。显卡驱动问题如果一时解决不了的话,可能会拖很长时间,甚至直到放弃,或者你甘愿不用图形界面。 www.dnjsb.com 如果以上都正常了,gentoo离你就很近了。接下来主要部署桌面环境,推荐比较轻量的,(如openbox、fluxbox、fvwm、dwm、awesome等),可以配合面板(tint2、bmpanel、pypanel等),不然要花很长时间编译。安装完后就按自己的需要进行配置了。现在还没有涉及的问题主要还有:声卡、网卡、摄像头等设备的驱动,以及触摸板不正常等。如果触摸板用手指点无反应,但手指移动有反应,试试:synclient TapButton1=1如果横向滚动不能用:synclient HorizEdgeScroll=1其他问题请查询synclient用法要把上边的命令放在启动脚本里,如是.xinitrc,确保它能在进入X前被调用。声卡问题,如果用alsa的话,genkernel默认编译的内核包含了alsa驱动,应该就要以正常使用了,如果没包含就要有点麻烦。如果内核包含了oss驱动(这是旧版本的),可能也可以正常用,但效果应该不好,能忍就算了吧。 www.dnjsb.com 如果都没有的话如果内核启用的声卡支持(menuconfig里有一层的里边是alsa和oss,它的上一层要选上),你可以选择安装alsa或者oss 驱动,个人推荐用oss4,它音质比较好,占用资源少(我试和内核的alsa里比mplayer放mp3时cpu占用省了一半)。但安装oss4不是很容 易,因为它不在portage里,要用layman,还要能连接国外网。alsa没装过,官网wiki有详细说明。如果现在就要安装oss4,也好:emerge laymanlayman -a oss-overlay然后再/etc/make.conf里加一句:source /var/lib/layman/make.conf然后emerge oss或者emerge oss-devel如果网络没问题的话应该正常安装。要保证/usr/src/linux指向的是当前用的内核然后/etc/init.d/oss start,一般要等几分钟因为要编译内核模块,如果成功了基本就可以用了,可以试试osstest,不成功的话问题就麻烦了,很可能你要重新编译内核
㈧ C语言可以实现 中断 和 多线程 这类功能吗
“晕,C语言不是灰常强大,无所不能吗?怎么有人说C语言不能实现 中断 和多线程??”这句话要分两部分来说,首先“晕,C语言不是灰常强大,无所不能吗?”。没有任何一种语言可以无所不能,原因很简单,任何的语言都脱离不了编译工具,而编译工具脱离不了编译环境。由于编译环境的不同,因此编译工具也有所不同,有得只针对JAVA,有得指针对C++,有得只针对C#。不管C语言多厉害,如果编译工具不支持,那也没有办法在这个编译工具上编译,以至于没有办法在那个编译工具的编译环境中运行。所以不能说无所不能。
“怎么有人说C语言不能实现 中断 和多线程啊”,这是一个概念性问题。纯粹的C语言只是一个工具,更多的是一种定义,一种格式,可以抽象成一种风格。就像定义一个整型变量i。为什么你不能用integer i定义,非得int i。例如函数的编写形式,命名规则等等。假如按照C语言的这些规则来编写程序,同时编译工具支持C语言,提供中断库,还有多线程库,那么C语言同样也可以实现中断和多线程。举个例子:例如你手头上只有一个TC编译工具,虽然他支持C语言,但是只能编译16位的DOS程序,碍于这个编译工具的局限性,所以你永远也写不出像Windows操作系统那种带窗口界面的Win32程序,也不能写一个针对.NET框架的网络服务程序。同样的,假如你要开发一个Windows软件,使用VC编译器,而这个编译工具本身带多线程库,同时支持Windows系统的很多调用,所以你完全可以以C语言的风格在这个编译器中调用各种Win32 SDK,开发一个多线程的Windows应用程序。假如你要使用中断,在Windows环境下可以使用微软提供的DDK(驱动开发包),他同样支持C语言,那么你就可以通过这个开发包调用很多中断。在Linux环境下,不需要开发包就可以直接调用,因为Linux自带了很多系统调用都是开放的。头文件声明直接就在Linux文件系统的Sys目录下。所以说他仅仅是一种风格。依赖于编译环境的系统调用同样也依赖于编译环境提供的链接库。
㈨ servlet多线程
1.javax.servlet.SingleThreadModel接口是一个标识接口,如果一个Servlet类实现了这个接口,那么Servlet容器将保证在同一个时刻只有一个线程可以在给定的servlet实例的service方法中执行。而将其他所有请求进行排队。
服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。
此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。因此,不建议实现SingleThreadModel接口,因为它在servlet规范中已经被废弃了。
2.使用同步块Synchronized,防止可能异步调用的代码块。这意味着线程需要排队处理。在使用同板块的时候要尽可能的缩小同步代码的范围,不要直接在sevice方法和响应方法上使用同步,这样会严重影响性能。
ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。
所以在Servlet上下文中尽可能少量保存会被修改(写)的数据,可以采取其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
HttpSession(线程是不安全的)
HttpSession对象在用户会话期间存在,只能在处理属于同一个Session的请求的线程中被访问,因此Session对象的属性访问理论上是线程安全的。
当用户打开多个同属于一个进程的浏览器窗口,在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,可能造成同时多线程读写属性。
这时我们需要对属性的读写进行同步处理:使用同步块Synchronized和使用读/写器来解决。
对于每一个请求,ServletRequest由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。所以ServletRequest是线程安全的。ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。
对于集合, 使用线程安全的Vector代替ArrayList,使用Hashtable代替HashMap。
不要在Servlet中创建自己的线程来完成某个功能。
Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现多线程安全问题。
,在多个servlet中对外部对象(比方文件)进行修改操作一定要加锁,做到互斥的访问
对于为什么要在doget方法里另上同步块,就是因为解决:当a,b同时访问时,如果a比b稍慢一些就会出现这样的情况,a页面空白,而b页面出现了服务端返回给a的结果,假如是比较敏感的个人信息不能让他人知道 的,而这种情况就会出现严重的安全问题,使用同步块并加锁可以做到a,b访问时两者的信息不会被对方及第三方知道!