在线程同步的时候为什么要使用对象监视器,什么是对象监视器?
有同步块和同步方法,同步块前加synchronized(对象){ },为什么要有括号中的对象?这个对象的作用是什么?如果没有对象这个对象监视器会怎么样?
这个对象应该是哪个对象,可能我说的不够准确,或者应该说这个对象的监视器应该是哪个对象的监视器,是随便的吗,还是有什么要求?也不能太随便吧。
例如在一个方法里,有synchronized块,这个对象监视器应该是?
java多线程同步synchronized——对象监视器
答案:4 悬赏:80 手机版
解决时间 2021-02-02 22:25
- 提问者网友:椧運幽默
- 2021-02-02 01:32
最佳答案
- 五星知识达人网友:佘樂
- 2021-02-02 02:20
class MyThread5 implements Runnable {
static int n=0;
public void run() {
Synchronized(this) {
n++;
try {
Thread.sleep(1);
} catch(InterruptedException e) {
return;
}
System.out.println(Thread.currentThread().getName()+" "+n);
}
}
}
public class TestSynchronized {
public static void main(String[] args) {
MyThread5 s = new MyThread5();
Thread a = new Thread(s);
Thread b = new Thread(s);
a.start();
b.start();
}
}
static int n=0;
public void run() {
Synchronized(this) {
n++;
try {
Thread.sleep(1);
} catch(InterruptedException e) {
return;
}
System.out.println(Thread.currentThread().getName()+" "+n);
}
}
}
public class TestSynchronized {
public static void main(String[] args) {
MyThread5 s = new MyThread5();
Thread a = new Thread(s);
Thread b = new Thread(s);
a.start();
b.start();
}
}
全部回答
- 1楼网友:空山清雨
- 2021-02-02 05:42
1、synchronized关键字的作用域有二种:
1)是某个对象实例内,synchronized amethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2)是某个类的范围,synchronized static astaticmethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){},它的作用域是当前对象;
3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
原文地址为:
http://koxwow.javaeye.com/blog/743989
里面讲的非常详细
- 2楼网友:你可爱的野爹
- 2021-02-02 04:08
class MyThread5 implements Runnable {
static int n=0;
public void run() {
Synchronized(this) {
n++;
try {
Thread.sleep(1);
} catch(InterruptedException e) {
return;
}
System.out.println(Thread.currentThread().getName()+" "+n);
}
}
}
public class TestSynchronized {
public static void main(String[] args) {
MyThread5 s = new MyThread5();
Thread a = new Thread(s);
Thread b = new Thread(s);
a.start();
b.start();
}
就这个
}
- 3楼网友:拾荒鲤
- 2021-02-02 03:34
1 这个对象就相当于一扇门,里面锁着的是共享的资源,每次只能有一个人能进入,并且只能容纳一个人,也就是说只有一个线程能获得这个锁。
2 没有这扇门的话,大家就能一拥而入,对资源进行访问,导致资源的状态混乱,从而出现不正确的结果
3 一般来说,这个对象就是大家要争夺的资源,也就是说,当我使用这个资源的时候,其他人不得执行,但也可以是一个不相干的资源,纯粹是起到锁的作用(高级应用)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯