synchronized问题?

wtjd 2004-07-27 04:55:29
假设我自定义某个线程myThread(通过继承Thread), 并且我在它的运行体加上同步关键字,即sychronized void run(){..}。 现生成它的两个对象a和b,我想问的是

1,a和b两个线程在任何时刻都只能有一个线程(要么是a要么是b)运行run()方法吗?

2,如果我没有加sychronized关键字,我觉得情况也一样,因为任何一时刻CPU只能被一个线程所占有(要么是a要么是b), 这样的话,既然CPU任何时刻都只被一个线程占有,那么任何时刻也当然只有一个线程运行run()方法? 我这样理解错在哪呢?

3,加与不加同步关键字到底最本质的区别在哪里?为什么我总是无法理解同步关键字的用处,我知道它是用来同步的,可是具体是怎么同步的呢?我希望从CPU占有角度来分析?
...全文
135 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdlly 2004-07-27
  • 打赏
  • 举报
回复
1、时间片是自己设定的
2、不是说可以延长时间片,是因为函数有了synchronized修饰,即使a的时间片到了,也必须等它执行完才释放锁
wtjd 2004-07-27
  • 打赏
  • 举报
回复
谢谢楼上那位老师的解答!
可是按照你的解答,
1,你说线程a 的时间片到了,我想知道时间片是多长呢,有一个明确的数字吗?线程a和线程b的时间片是一样的吗?
2,你说:"于sychronized 了且a已经拿到了obj的锁,所以线程b进入等待状态直到线程a退出方法test为止",
也就是synchronized可以延长a的时间片了?对吗?
x97 2004-07-27
  • 打赏
  • 举报
回复
使用线程可以分配到多个cup上进行计算。
ChDw 2004-07-27
  • 打赏
  • 举报
回复
你在run上面加sychronized 是没有什么意义的

1.sychronized 的意思是对同一个对象而言,对于a b来说它们的lock是不一样的,所以其实是可以同时进入run方法

2.当然,对CPU而言是只有一个线程在运行

同步的最大用处是解决线程访问上的冲突,假如我有一个方法
public class A {
private int count;
public void test() {
if(count == 10) {
count = 0;
}
count++;
...
}
}
以上是一个例子(当然代码是很笨的一个写法了)
如果A obj = new A();以后,在线程a和线程b中都可以访问到对象obj,都调用了方法test
问题来了:开始线程a先运行,当它判断完count == 10之后,正准备但是还没有执行count = 0时候,线程a的时间片已经到了。切换到线程b运行,它运行完count++之后,b的时间片也完了,又换回线程a,a执行了count = 0;

这样你很明显看到方法的本意已经被打破,出现了线程同步问题。

但是如果加入了public sychronized void test()之后,线程a进入了方法,当时间片完了以后,线程b也想执行方法test,但是由于sychronized 了且a已经拿到了obj的锁,所以线程b进入等待状态直到线程a退出方法test为止

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧