-
synchronized void aMethod() 的迷惑,求解10
在项目中,我想用让a方法在被一个线程调用后,就不能让其他任何一个方法或者对象调用,听别人说用synchronized修饰方法就可,但我看到有人这样说:
synchronized aMethod(){}可以防止多个线程同时访问这个对象实例的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。
这段话是不是前后矛盾啊,还是我理解错了,前面说“可以防止多个线程同时访问这个对象实例的synchronized方法”,而后面又说“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 ”
怎么理解这段话呢,或者说我的需求是用synchronized就ok么?求解2013年8月01日 15:55
5个答案 按时间排序 按投票排序
-
LZ对锁的机制没有理解,如果加了synchronized关键字的方法是实例方法,那么锁就是加在实例上的,“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法”是因为另一个实例有另一个锁,当然可以访问了。
2013年8月06日 11:18
-
synchronized 锁分为两种:
1.放在static方法上的synchronized 的锁 是 “Class” 的锁,且一个类只能有一把类锁(static synchronized方法共享一把锁子),所以同一时间只能一个用户抢到钥匙开锁其他用户都的等着他释放钥匙。这就是为什么当调用一个synchronized方法时其他其他synchronized方法也被锁的原因(其他用户得不到钥匙)
2.放到非静态方法上的synchronized 的锁 是 “对象” 的锁 ,因为这个锁不在class上而在对象上,所以同一类不同对象间的非静态锁是没有任何关系的。
a.同理以个对象内部还是只有一个锁 一把钥匙,谁抢到钥匙才能访问====>"
一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)"
b.因为不同对象的有不同的锁和钥匙所以===>“不同对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 ”
synchronized:问题其实就在于看 锁在谁的身上。2013年8月02日 13:35
-
楼上说的没有错,我在按照我的方式给你解释下,synchronized 是同步锁 当一个非static方法被synchronized修饰后,实际上是对这个方法所在的对象加了对象锁。例如A类的一个方法f() 有如下定义 public void synchronized f(){....}; A a = new A();当程序调用
a.f()时,那么就对a这个对象加同步对象锁。说的直白点就是锁定了a这个对象。那么如果有其他线程也需要调用a对象的f()方法必须要等待上一个调用这将这个对象锁释放,也就是f()方法执行完毕后,那么可以推断出 如果a对线有其他synchronized方法 那么其他线程也不能调用其他的synchronized方法,但是可以调用非synchronized修饰的方法。
如果一个static方法被synchronized修饰或者有如下代码块synchronized(A.class){...}
那么它锁定的是这个类,类级锁。那么如果有一个线程正在执行a对象的synchronized方法其他线程想要调用a对象的任何方法,都必须要等待该线程释放对a的锁定,其他线程在进行竞争。不知道这样解释你是否明白。2013年8月01日 23:25
-
引用如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法
是这样的吗?2013年8月01日 17:42
-
首先明白一点儿,synchronized是对象锁。“可以防止多个线程同时访问这个对象实例的synchronized方法”这是说,一个对象一次只能有一个synchronized在运行;“其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 ”请注意了,这是另一个对象实例,换句话说,现在有两个类实例,当然可以分别访问里面的synchronized方法了。
2013年8月01日 17:02
相关推荐
public synchronized void setHttpConnectionManager(HttpConnectionManager httpConnectionManager) { } public HttpClientParams getParams() { return null;} public void setParams(HttpClientParams params)...
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
java中synchronized用法
你还在用synchronized?线程安全相关知识深入剖析
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
java里面synchronized用法
Synchronized关键字的用法
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
synchronized 测试案例,同步一个对象或者多个对象的案例均有,还有成功和失败案例的对比
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
synchronized是很重要的,但是不少人不是很明白synchronized的用法,这里有详细的doc文档给大家参考
我自己的博客所附带的案例源码,我的博客标题名称是"synchronized并发讲解",关注我等待跟多更新
Synchronized与ThreadLocal
synchronized与单例的线程安全问题,博客地址:https://www.jianshu.com/p/486ed9c8662a
java语言 并发编程 ReentrantLock与synchronized区别 详解
关于synchronized的自学笔记
java中synchronized的使用,java中的锁锁的到底是什么?是括号里的代码块吗?肯定不是的;
java同步synchronized关键字用法示例
java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来
synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class ...