多线程遇到的问题例子(java两个线程同时调用一个类里的同一个方法,这样会出现什么情况有没有问题)

本文目录
- java两个线程同时调用一个类里的同一个方法,这样会出现什么情况有没有问题
- 使用多线程时,主线程语句被重复执行
- 求一个c++多线程导致程序崩溃的例子
- 请教一个有关C++多线程产生重复数据的简单例子
- (C++多线程问题)CreateThread()函数问题
java两个线程同时调用一个类里的同一个方法,这样会出现什么情况有没有问题
根据不同的情况可能存在的情况有:
1、如果该方法不涉及写公共的资源比如一个静态的变量或者写文件,修改某个数据库的值的时候没有影响。
2、比如你这个类里的方法只是对输入的参数做一个计算然后返回计算的值就没有影响。
3、但是如果是修改公共的资源比如修改数据库中存储的一个value则有可能出现问题,如:
public void writeDb(String key, String value) {
collectiondb();
write(key, value);
closeDbCollection();
}
4、因为Java的线程运行顺序是不一定的,可以第一个线程运行完连接数据库到后挂起了,这时候第二个线程开始运行,如果你的collectiondb()处理使用的是类中的一个实例变量Connection conn来保存数据库的连接,当第二个线程运行完毕以后conn也被关闭了,第一个线程继续执行write函数写数据库值的时候就会抛出异常。
这是一个例子,还有其他可能产生脏数据的问题。
多线程如果使用公共资源的话最好在方法上声明synchronized关键字让其同步。
使用多线程时,主线程语句被重复执行
我也写过不少类似的代码,但没有出现会重复输出的问题.这里存在的一个问题是,控制台为在多个线程中共享的资源,两个线程在没有同步的情况下使用控制台窗口(如上面代码是把字符打印输出),经常会出现如下问题:
用上面的例子来说吧,很可能主线程的刚刚输出"当前为",后面的"主线程"还没来得及输出,此时另一个线程抢先(在多核CPU中也可能是并发)运行输出"当前为分线程",接着主线程又获得运行权,接着输出"主线程".
解决这种问题的办法是使用同步对象.由于同步的方法比较多,而且牵涉到的内容如效率,死锁等等也比较难以三言两语讲清楚,这里就不细说了,如果想了解详情可以看看《WINDOWS核心编程》,里面有几章是专门讲多线程及同步技术的.
求一个c++多线程导致程序崩溃的例子
这个应该不难吧,对已经释放的地址double free程序都会出问题的,下面写了个简单例子你看下:
#include 《iostream》
#include 《Windows.h》
const static int ThreadCount = 10;
LPVOID param = "hello";
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
Sleep(100);
delete lpParam;
return 0;
}
int main()
{
HANDLE hThread;
for (int i = 0; i 《 ThreadCount; i++)
{
hThread = CreateThread(NULL, 0, ThreadProc, param, 0, 0);
}
WaitForMultipleObjects(ThreadCount, hThread, true, INFINITE);
for (int i = 0; i 《 ThreadCount; i++)
{
CloseHandle(hThread);
}
return 0;
}
请教一个有关C++多线程产生重复数据的简单例子
两个线程共享同一会出现问题。
原理是这样的
比如数字A=100
这时候线程1和线程2都要执行 A-- 这条语句。
A--翻译成汇编是这样的:
mov ax,A
sub ax,1
mov A,ax
两个线程同时执行的时候你可以看到这样的情况
mov ax,A ;线程1,这时候ax=100,A=100
sub ax,1 ;线程1,这时候ax=99
mov ax,A ;线程2,这时候ax=100,A=100
sub ax,1 ;线程2,这时候ax=99
mov A,ax ;线程1,这时候A=99
mov A,ax ;线程1,这时候A=99
我们本来期望两个线程进行两次自减,但是结果却只减了1次。
解决方案:设置信号量就可以了~vc上有专门的api可以调用
(C++多线程问题)CreateThread()函数问题
一、Windows API函数。该函数在主线程的基础上创建一个新线程。微软在Windows API中提供了建立新的线程的函数CreateThread。
二、CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:
1.在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回
2.把线程退出码置为STILL_ACTIVE,把线程挂起计数置1
3.分配context结构
4.分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD
5.lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数
6.把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数
三、MSDN中CreateThread原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)
processthreadsapi.h中CreateThread原型:
WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
CreateThread(
_In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_SIZE_T dwStackSize,
_In_LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt___drv_aliasesMemLPVOID lpParameter,
_In_DWORD dwCreationFlags,
_Out_opt_LPDWORD lpThreadId
);
四、示例:

更多文章:
vmware支持arm吗(Qemu vmware 是都是虚拟机吗有什么不同)
2026年5月7日 05:45
云数据库开审计(sqlserver如何设置数据库层面日志审计)
2025年12月13日 14:45
zxing-cpp不支持中文吗?请问谷歌开源项目“zxing”,“zxing“这个词怎么念吗
2026年5月12日 07:15
css 设置背景的颜色及形状?请问一下CSS3样式中如何让背景渐变与背景图片共存啊!
2025年6月13日 20:00
to close和closeing(closeto后面为什么可以直接接名词)
2025年10月28日 17:30
hbuilder浏览器不显示(最新版hbuilder换谷歌浏览器打不开)
2026年8月4日 09:00
量化中的feature和weight(同位素在量化计算中如何处理,有什么区别)
2026年8月8日 07:30
expect和exclude(expect和besides有什么区别)
2026年9月19日 02:30

















