请教关于java的synchronized问题。

哈根达斯VIP 2011-09-01 07:12:53
当一个线程进入一个对象的一个synchronized方法之后,其它线程是否可进入此对象的其它方法?请求高手给出解答,并附上测试的代码,非常感谢!
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
动感光波 2011-09-02
  • 打赏
  • 举报
回复
。。。坑跌
夕水溪下 2011-09-02
  • 打赏
  • 举报
回复
不一定,锁子锁的不是代码,是对象!看你的另外的代码是不是会牵扯到你想锁的对象
末凡 2011-09-02
  • 打赏
  • 举报
回复
其他对象不能访问该对象的synchronized的其他方法,可以访问没有synchronized的。2、3楼坑爹呢
downkang 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 keyboardsun 的回复:]
当然可以了,即使是其它方法也是synchronized ,照样也可以
[/Quote]
其它方法也是synchronized 真的可以吗?你不要坑爹啊!
112 2011-09-01
  • 打赏
  • 举报
回复
可以。synchronized关键字作用于方法之上,标明该方法是同步方法,那么在运行期,任何线程想要调用该方法,就需要获得该方法所属的对象的锁。一旦某个线程获得了该对象的锁,也就是锁住了这个对象,那么其它想要访问该方法的线程由于得不到该对象的锁,只能等待。但是,该对象中没有加synchronized关键字的方法,在被调用的时候,不需要获得对象的锁,因此该对象被锁住也无所谓,照样可以被直接调用。
meran 2011-09-01
  • 打赏
  • 举报
回复
2 楼 3 楼 说的不对, synchronized 是在对象上加了一把互斥锁,只有当前线程可以访问该对象的synchronized 方法。
DEMO 给你

package com.meran.normalTest;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class CSDNDemo {
public synchronized void step() throws InterruptedException{
TimeUnit.SECONDS.sleep(4);
System.out.println(Thread.currentThread()+"执行step 1");
TimeUnit.SECONDS.sleep(4);

}
public synchronized void step2(){
System.out.println(Thread.currentThread()+"执行step2");
}
public static void main(String [] args) throws InterruptedException{
CSDNDemo temp=new CSDNDemo();
Thread t1=new Thread(temp.new A());
t1.start();
TimeUnit.SECONDS.sleep(1);
Thread t2=new Thread(temp.new B());
t2.start();
}

class A implements Runnable{
public void run(){
try {
step();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
class B implements Runnable{

@Override
public void run() {
step2();

}

}
}




meran 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 benluobobo123 的回复:]
可以的 没问题 只要不是同步方法 线程都是可以同时调用的
[/Quote]

这个说的对啊。 其他线程不可以进入 该对象的synchronized 方法,
可以以进入 非 synchronized 方法。
synchronized 修饰static 相当于 把互斥锁加到了 类变量上而已。
KG071 2011-09-01
  • 打赏
  • 举报
回复
非static的synchronized方法 两个不同的对象可以同时操作
static的synchronized方法两个不同的对象不能同时操作
keyboardsun 2011-09-01
  • 打赏
  • 举报
回复
当然可以了,即使是其它方法也是synchronized ,照样也可以
当然如果是static的,那就会锁住
benluobobo123 2011-09-01
  • 打赏
  • 举报
回复
可以的 没问题 只要不是同步方法 线程都是可以同时调用的

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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