请问java关于多线程的问题?
最近学了java的多线程,感觉有点懵,我说说自己的理解,请各位指正下http://zhidao.baidu.com/question/402791554先看这个哥们的问题...
最近学了java的多线程,感觉有点懵,我说说自己的理解,请各位指正下
http://zhidao.baidu.com/question/402791554
先看这个哥们的问题了,我的理解是
他的synchronized锁错了对象,他锁的是this,但是this是不确定的,有锁跟没锁基本一样。
是不是这样的?
另外还有一些线程的理解
sleep在synchronized里面时调用会阻塞当前线程,但是在这段时间内却不会给其他线程调用,
因为放进了synchronized上了锁。
还有,最近学了qt和java同时学了tcp与udp通信,脑袋一片糊涂。
java的tcp通信例子是有掺杂进多线程的,实现服务端与客户端1对多通信的,它把run函数放进一个线程,还有main函数一个线程,
但是想想,好像没有感觉到多线程的什么优点,甚至感觉不用多线程,都可以实现通信,
比如用多个类实现。
(ps:汗,用多个类好像可以实现多线程的样子) 展开
http://zhidao.baidu.com/question/402791554
先看这个哥们的问题了,我的理解是
他的synchronized锁错了对象,他锁的是this,但是this是不确定的,有锁跟没锁基本一样。
是不是这样的?
另外还有一些线程的理解
sleep在synchronized里面时调用会阻塞当前线程,但是在这段时间内却不会给其他线程调用,
因为放进了synchronized上了锁。
还有,最近学了qt和java同时学了tcp与udp通信,脑袋一片糊涂。
java的tcp通信例子是有掺杂进多线程的,实现服务端与客户端1对多通信的,它把run函数放进一个线程,还有main函数一个线程,
但是想想,好像没有感觉到多线程的什么优点,甚至感觉不用多线程,都可以实现通信,
比如用多个类实现。
(ps:汗,用多个类好像可以实现多线程的样子) 展开
3个回答
展开全部
你理解错了,你应该看他采纳的答案,那个理解才是正确的。
多线程首先你要知道多线程的作用:多线程是当单线程运行会有阻塞的时候,我们采用多线程会把阻塞降到只有单个线程,其他线程还可以用。最典型的就是打开文件,如果用单线程打开10W个文件需要的时间,和使用一千个线程的时间相差很大。用生活中的例子,比如你开一家银行,只有一柜台那么所有人都要在那个柜台办理业务。这个时候多个柜台就相当于多线程。那么多线程就会产生一个问题,假如A线程和B线程同时去修改数据的时候中间会有时间差,那样会导致修改数据出错。就像A柜台的业务员一看你在等,就叫你去,同时B柜台的业务员也看到你在等,也叫你去,那你去哪里呢?那么他们之间这个看,还在等待办理业务人员的时候就要保证数据一致,A在叫的时候,B要等A叫完了,再来叫。所以他们之间就会出现锁。
那么锁又分对象的,就是你锁的是什么东西。同一个东西的锁才会互斥,还是上面那个例子,假设A,B是办理普通业务的,C是办理VIP业务的。那么AB在叫人的时候,叫的是等待办理普通业务的人,他们都在处理普通业务人群的任务,所以他们是互斥的,C办理VIP的,都不在一个大厅等待,那么C和A或者C和B都不是互斥的。因为他们是不可能同时叫同一个人的。
讲的可能有点乱,但是多线程也就那么回事。
多线程首先你要知道多线程的作用:多线程是当单线程运行会有阻塞的时候,我们采用多线程会把阻塞降到只有单个线程,其他线程还可以用。最典型的就是打开文件,如果用单线程打开10W个文件需要的时间,和使用一千个线程的时间相差很大。用生活中的例子,比如你开一家银行,只有一柜台那么所有人都要在那个柜台办理业务。这个时候多个柜台就相当于多线程。那么多线程就会产生一个问题,假如A线程和B线程同时去修改数据的时候中间会有时间差,那样会导致修改数据出错。就像A柜台的业务员一看你在等,就叫你去,同时B柜台的业务员也看到你在等,也叫你去,那你去哪里呢?那么他们之间这个看,还在等待办理业务人员的时候就要保证数据一致,A在叫的时候,B要等A叫完了,再来叫。所以他们之间就会出现锁。
那么锁又分对象的,就是你锁的是什么东西。同一个东西的锁才会互斥,还是上面那个例子,假设A,B是办理普通业务的,C是办理VIP业务的。那么AB在叫人的时候,叫的是等待办理普通业务的人,他们都在处理普通业务人群的任务,所以他们是互斥的,C办理VIP的,都不在一个大厅等待,那么C和A或者C和B都不是互斥的。因为他们是不可能同时叫同一个人的。
讲的可能有点乱,但是多线程也就那么回事。
追问
谢谢,有所收获
展开全部
synchronized(this)是锁住了他创建的 trd1 trd2 trd3实例, 所以没有起作用
tcp的1对多通信是服务器端一个线程,每个服务端一个线程,利用服务端来转发消息,达到一对多通信的目的
tcp的1对多通信是服务器端一个线程,每个服务端一个线程,利用服务端来转发消息,达到一对多通信的目的
追问
请问如果服务端没有多线程会出现什么情况?
我实现没有使用多线程,我是通过创建多个类对象的方式来实现的,
比如我把服务端的部分放进一个类a,然后又创建一个管理服务端的类b
这个类中有个ServerSocket,用来创建服务端和接受客户端连接,
一旦接受客户端连接就new一个a对象,一个a对象对应一个客户端,
我这种方式跟多线程比有何优劣?谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1,理解正确,几个线程各子锁定自己的同步锁,当然是没有什么用。对于竞争资源,必须锁定同一个锁,你可以new 一个Object用于锁,也可以用class做锁,反正都要是同一个。
2,理解有偏差,其他线程也会被调度,不可能一个线程一直sleep,其他线程都不工作了,影响范围没有那么大,仅限于需要进入同一个同步锁的,它们进不了工作。
所谓占着茅坑不拉shi,就是这个状态了。
3,多线程的好处是充分利用CPU的资源,实现并发。例如你说的通讯,往往是花百分之几的时间CPU处理数据,剩下的绝大部分时间,都是在等待网络数据。使用多线程可以充分利用这段时间。
2,理解有偏差,其他线程也会被调度,不可能一个线程一直sleep,其他线程都不工作了,影响范围没有那么大,仅限于需要进入同一个同步锁的,它们进不了工作。
所谓占着茅坑不拉shi,就是这个状态了。
3,多线程的好处是充分利用CPU的资源,实现并发。例如你说的通讯,往往是花百分之几的时间CPU处理数据,剩下的绝大部分时间,都是在等待网络数据。使用多线程可以充分利用这段时间。
追答
wait和notify以及notifyAll,都是建立在获取了锁的前提下,wait也是等待在这个锁上,notify的目标也是wait在这个锁上的线程。
举个经常使用的场合:比如线程A和B,一个生产一个消费,
A每次获取一个队列上的消息,进行处理,当队列没有消息时,调用wait
B每次往队列上放一个消息,放好了之后notify一下,告诉A你可以继续。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询