2 mark sunshine Mark_Sunshine 于 2016.01.28 19:45 提问

如果synchronized(new Object){} 和 Object obj = new Object(); synchronized(obj){}的区别是什么?

如果synchronized(new Object){} 和 Object obj = new Object(); synchronized(obj){}的区别是什么? 主要是在synchronized()中放new Object 是四个线程一起,而放obj对象是一个一个的执行,这是什么原因呢?

代码:
class XianChengDemo {

public static void main(String[] args)

{

Card c = new Card();

Thread t = new Thread(c);

Thread t1 = new Thread(c);

Thread t2 = new Thread(c);

Thread t3 = new Thread(c);

t.start();

t1.start();

t2.start();

t3.start();
}}

class Card implements Runnable{
private static int cards = 100;
Object obj = new Object();

public void run()

{ while(true)
{ synchronized(obj)
{ if(cards>0)
{ try{Thread.sleep(10);}catch(Exception e){} System.out.println(Thread.currentThread().getName()+"------"+cards--);
}
else{
break;

}
}
} }}

2个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.01.28 20:14
已采纳
  第一种写法使用的锁监视器对象是临时创建的,即每个线程运行到这段代码时都会新建一个对象并以此为同步锁,锁不同当然不存在锁竞争而等待问题,所以看到的是并行的。
 第二个写法同步块对象是全局的成员变量,所有访问这段代码的线程使用的是同一个锁监视器,所以有竞争等待。
caozhy
caozhy   Ds   Rxr 2016.01.28 20:53

Object obj = new Object();定义成函数内的成员变量,那么和第一种一样,定义成成员变量,你写的那种,那么锁定的是实例,也就是相同的对象实例被多个线程调用,那么会被同步。
还可以锁静态变量。那么相当于全局类的同步。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
synchronized(this)和synchronized(object)区别
synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如: public synchronized void accessVal(int newVal); synchronized 方法控制对类成员变量
从头认识多线程-2.14 由同步的synchronized (newobject()) 引起的异步现象和脏读
这一章节我们来讨论一下由同步的synchronized (newobject()) 引起的异步现象。1.代码清单package com.ray.deepintothread.ch02.topic_14; /** * * @author RayLee * */ public class AsynchOfSynchWithUnSameObject { public static void
synchronized(this)和synchronized(object)的理解
如果有一块代码(或方法)可能被多个线程同时访问,然后里面操作的数据修改操作可能因为不同线程的操作而不一致的时候,使用synchronized锁定这块代码,确保同时只有一个线程访问这个代码块。也就是说,关键字synchronized可以用在任何类的方法里面,即使该类没有实现Runnable接口或者继承Thread类。 使用this和object的区别:this是对当前类做控制, 即保证当前
从头认识多线程-2.15 解决由同步的synchronized (newobject()) 引起的脏读的方法
这一章节我们来讨论一下解决由同步的synchronized (newobject()) 引起的异步现象和脏读的方法。1.代码清单package com.ray.deepintothread.ch02.topic_14; /** * * @author RayLee * */ public class DirtyRead { public static void main(String
线程-synchronized方法和同步块的作用范围;synchronized(this)和synchronized(obj)的区别
原文:http://m.blog.csdn.net/blog/u010802573/38661719 参考资源: http://www.cnblogs.com/oracleDBA/archive/2010/05/22/1741642.html http://www.cnblogs.com/highriver/archive/2011/12/18/2291965.htm
synchronized(this)、synchronized(class)与synchronized(Object)的区别
在多线程开发中,我们经常看到synchronized(this)、synchronized(*.class)与synchronized(任意对象)这几种类型同步方法。
Java 入门 之 synchronized(this) 和 synchronized(object)
误区一:synchronized关键字只能用在实现Runnable或者继承了Thread类的子类的方法里面。 正解:如果有一块代码(或方法)可能被多个线程同时访问,然后里面操作的数据修改操作可能因为不同线程的操作而不一致的时候,使用synchronized锁定这块代码,确保同时只有一个线程访问这个代码块。也就是说,关键字synchronized可以用在任何类的方法里面,即使该类没有实现Runna
synchronized(class)、synchronized(this)与synchronized(object)的区别分析
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。synchronized void f() { /* body */ } 和void f(
synchronized(object)的应用场景以及与synchronized修饰方法的区别
synchronized(object)的作用原理是:在object内有一个变量,当有线程进入时,判断是否为0,如果为0,表示可进入执行该段代码,同时将该变量设置为1,这时其他线程就不能进入;当执行完这段代码时,再将变量设置为0。 虽然可以通过synchronized 关键字来修饰方法,但是不同的线程如果创建了各自的对象实例,多个对象实例调用方法时仍然是异步的。 如果想保证代码块在任务情况下都同步,即代码块在程序的中同一时刻只被一个线程调用,即需要使用synchronized(object)。
synchronized 关键字可修饰 object和方法
 原文转自: http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一