synchronized的问题,多线程高手来,谢谢

问题描述

publicclassMyThreadextendsThread{privatestaticintcount=0;publicsynchronizedvoidrun(){for(inti=0;i<10;i++){count=count+1;System.out.println(getName()+""+count);}}publicMyThread(Stringthread){super(thread);}/***@paramargs*/publicstaticvoidmain(String[]args){//TODO自动生成方法存根MyThreadt1=newMyThread("t1");MyThreadt2=newMyThread("t2");t1.start();//try{//sleep(100);//}catch(InterruptedExceptione){}t2.start();}}代码很简单,我创建了t1t2两个线程,想让他们互斥的访问run函数,但是运行的时候顺序总是不对,除非用个sleep到底怎么回事啊?

解决方案

解决方案二:
你是想t1先运行,t2后运行是吧对于线程,t1和t2总是互相争夺cpu资源的,即使你先t1.start()
解决方案三:
privatestaticObjectlock=newObject();publicvoidrun(){synchronized(lock){for(inti=0;i<10;i++){count=count+1;System.out.println(getName()+""+count);}}}

解决方案四:
t1和t2是不会互斥访问run函数的。你要搞清楚一个概念,synchronized关键字同步的不是同一段代码,而是同一个对象。而t1和t2是两个对象,因此,当t1执行run函数的时候,根本不妨碍t2也去执行run函数,因为t1和t2是两个对象嘛。
解决方案五:
引用3楼westlifejxb的回复:

t1和t2是不会互斥访问run函数的。你要搞清楚一个概念,synchronized关键字同步的不是同一段代码,而是同一个对象。而t1和t2是两个对象,因此,当t1执行run函数的时候,根本不妨碍t2也去执行run函数,因为t1和t2是两个对象嘛。

是的,如果LZ在run中sleep一会儿就更显而易见了publicsynchronizedvoidrun(){for(inti=0;i<10;i++){count=count+1;try{sleep(100);}catch(InterruptedExceptione){}System.out.println(getName()+""+count);}}

解决方案六:
synchronized是一个对象当前执行的同步方法结束后,该对象的另一个同步方法才可以执行。
解决方案七:
引用3楼westlifejxb的回复:

t1和t2是不会互斥访问run函数的。你要搞清楚一个概念,synchronized关键字同步的不是同一段代码,而是同一个对象。而t1和t2是两个对象,因此,当t1执行run函数的时候,根本不妨碍t2也去执行run函数,因为t1和t2是两个对象嘛。

谢谢,但是我还有一个疑问,既然这样,那么synchronized修饰函数的作用是什么呢?
解决方案八:
该回复于2011-03-28 08:57:46被版主删除
解决方案九:
难道楼主想写的是死锁的问题?
解决方案十:
引用6楼aoyuehan11的回复:

引用3楼westlifejxb的回复:t1和t2是不会互斥访问run函数的。你要搞清楚一个概念,synchronized关键字同步的不是同一段代码,而是同一个对象。而t1和t2是两个对象,因此,当t1执行run函数的时候,根本不妨碍t2也去执行run函数,因为t1和t2是两个对象嘛。谢谢,但是我还有一个疑问,既然这样,那么synchronized修饰函数的作用是什么呢?……

修饰实例方法使用对象的监视器,进行同步,如果有多个实例方法都是synchronized,则同一时刻,只能有一个方法在运行
解决方案十一:
加锁!!!让没有用的资源等待在用的资源结束使用后在申请使用
解决方案十二:
哦,我懂了,synchronized方法是为了让一个对象互斥的访问多个synchronized方法的,不是让多个对象互斥的访问这一个synchronized方法的。当synchronized修饰一个方法时,锁住的对象是this,总是调用这个方法的对象本身,对于多个对象来说,它们就互不影响了。其实,想要多个对象互斥的访问run方法,就该不用synchronized修饰这个方法,而是用synchronized(MyThread.class)块来修饰for循环,这样锁住的是MyThread.class,从java的反射机制将,MyThread.class就是当前调用run的对象,上锁后,只有拥有这个对象的线程才能进入run
解决方案十三:
引用1楼singwhatiwanna的回复:

你是想t1先运行,t2后运行是吧对于线程,t1和t2总是互相争夺cpu资源的,即使你先t1.start()

同意1L的说法。。
解决方案十四:
MyThreadt1=newMyThread("t1");MyThreadt2=newMyThread("t2");不是同一个对象的线程!TestThredth=newTestThread();newThread(th).start();newThread(th).start();这样才能互斥!
解决方案十五:
synchronized在你这例子中几乎是没用,此方法只能保证在同一个实例中多线程调此方法时有用。

时间: 2024-08-01 10:04:03

synchronized的问题,多线程高手来,谢谢的相关文章

c#接口实例化问题求高手解答谢谢

问题描述 c#接口实例化问题求高手解答谢谢 c#不是规定接口不能被实例化吗,而且不能有方法的定义.但为啥看到IEnumerable这个接口还被实例化了呢 解决方案 C#实例化顺序问题 解决方案二: 是不可以实例化,但是是可以实例化一个实现它的类型. IEnumerable<int> e = new IEnumerable<int>(); // error IEnumerable<int> e = new List<int>(); // correct 解决方

javaweb-求 高手解答 谢谢........

问题描述 求 高手解答 谢谢........ 严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:301) at com.opensymphony.xwor

如在两个窗体A、B各有一个textbox,先加载A后加载B。当加载B时,我想B内的textbox的属性和A内的textbox的属性一样,求教高手,谢谢!!!

问题描述 如在两个窗体A.B各有一个textbox,先加载A后加载B.当加载B时,我想B内的textbox的属性和A内的textbox的所有属性一模一样.我不想对B内的textbox的属性手动写代码一一设置,求教一比较好的方法求教高手,谢谢!!! 解决方案 解决方案二:控件属性可以绑定到对象实例,只要你将不同控件绑定到同一个对象实例,那么对象属性改变时不同控件自动就改变了:一个控件改变时自然就传递到其它控件也改变了.解决方案三:dimaastextbox'克隆一个textboxa=form2.t

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback

多线程-高手请进!!!---线程安全问题,怎么解决new String 问题

问题描述 高手请进!!!---线程安全问题,怎么解决new String 问题 场景是:一个订单号只能一个在付款,只能一个线程处理,不同的订单号支持并发处理 现在如果是new String("20140719140818");就有问题怎么解决 如果不是new出来的,什么情况会出现问题 public class Test { public static void main(String[] args) { new Thread(){ public void run(){ pay(&quo

java基本教程之synchronized关键字 java多线程教程_java

本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchronized代码块4. 实例锁 和 全局锁 1. synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,synchronized(obj)就获取了"obj这个对象&quo

本人小菜鸟 问个C语言的题目 望高手帮忙 谢谢

问题描述 求y=分2项,第一项当X的绝对值大于9.8的时候y=(ax)先乘一个平方在开5次方第二项当X的绝对值小于等于9.8的时候sin((ax)平方)前面这个值除以ax(ax-1)这个值由于有的符号打不出望见谅帮帮忙啊谢谢咯

关于junit测试单个方法的问题,请高手帮助 谢谢!

问题描述 我有一个测试类,里面很多测试方法,我想测试其中的一个,用junit3在eclipse中怎么测试啊谢谢回答 解决方案 解决方案二:eclipse自带帮助:Javadevelopmentuserguide>GettingStarted>BasictutorialWritingandrunningJUnittests解决方案三:在outline视图中,右键点击你要测试的方法,选runas---junittest解决方案四:引用2楼sun201200204的回复: 在outline视图中,右

求教个问题 求高手解答 谢谢

问题描述 有个txt文档几十万字左右想通过java实现用流读出来再写到另外一个文件里要求光要"自然回复"后面的若干数据(一段或者一行几十字都可以)怎么弄呢小弟琢磨了半天没写出来....求高手指教 解决方案 解决方案二:"自然回复"后面的若干数据(一段或者一行几十字都可以)这个条件比较笼统解决方案三:自然回复是啥玩意儿解决方案四:可以用一个正则去匹配,只要find()为true,取出group()就是你想要的数据了解决方案五:用substring啊,把内容读进来,然后