Tag: 同步

Java监视器有多重?

假设我有一个包含数千个对象的数组,以及可能访问每个对象的少量线程。 我想保护对其中一个对象方法的访问。 最简单的方法是将该方法声明为synchronized 。 但是,这可能会导致创建数千个监视器,无论它们实现的方式如何。 如果这是Win32,我永远不会创建数千个内核对象,如Mutex,但CRITICAL_SECTION 可能是合理的。 我想知道Java的情况如何。 鉴于争用的可能性很低,监视器的使用是否会超过他们所需的大量内存? 在Java中使用这种低粒度同步的做法有多常见? (显然有一些解决方法,比如使用一个更小的同步对象数组,可以使用一些哈希来访问。我不是在寻找一个实用的解决方案,我正在寻找一个洞察力)。

java monitor是否包含实例变量?

是不是java中的监视器不限制对实例变量的访问,而只限制声明为synchronized的方法或者同步语句中的代码? 我已经创建了两个线程, thread y调用sync方法,它被声明为synchronized,而thread r调用unsync方法,该方法未声明为synchronized。 两者都在共享对象上调用方法。 Thread r能够修改对象s的实例变量,同时该对象s监视器或锁仍被thread y 。 是Java中的监视器不限制对实例变量的访问,并且只限制声明为synchronized的方法或同步语句中的代码? public class stuff { private int a = 10; public synchronized void sync() { long t1 = System.currentTimeMillis(); System.out .println(“Okay, I am in sync method. I will be waiting for 10 seconds. Current Time = ” + System.currentTimeMillis()); while (System.currentTimeMillis() – t1 < 10000); […]

什么案例需要Java中的同步方法访问?

在什么情况下需要同步访问实例成员? 我理解,对类的静态成员的访问总是需要同步 – 因为它们在类的所有对象实例中共享。 我的问题是,如果我不同步实例成员,我什么时候会不正确? 例如,如果我的class级是 public class MyClass { private int instanceVar = 0; public setInstanceVar() { instanceVar++; } public getInstanceVar() { return instanceVar; } } 在什么情况下(使用类MyClass )我需要有方法: public synchronized setInstanceVar()和public synchronized getInstanceVar() ? 提前感谢您的回答。

HttpSession中的同步是否可行?

更新:解决方案后问题。 题: 通常,同步是在JVM内串行化并行请求,例如 private static final Object LOCK = new Object(); public void doSomething() { … synchronized(LOCK) { … } … } 在查看Web应用程序时,“JVM全局”范围上的某些同步可能会成为性能瓶颈,仅在用户的HttpSession范围内进行同步会更有意义。 以下代码是否可能? 我怀疑同步会话对象是一个好主意,但听到你的想法会很有趣。 HttpSession session = getHttpServletRequest().getSession(); synchronized (session) { … } 关键问题: 是否保证会话对象是处理来自同一用户的请求的所有线程的相同实例 ? 总结答案/解决方案: 看来会话对象本身并不总是相同,它依赖于servlet容器(Tomcat,Glassfish,…)的实现,而getSession()方法可能只返回一个包装器实例。 因此,建议使用存储在会话中的自定义变量作为锁定对象。 这是我的代码提案,欢迎提供反馈: 帮手类中的某个地方,例如MyHelper : private static final Object LOCK = new Object(); public static Object getSessionLock(HttpServletRequest […]

为什么抽象方法不能同步?

我正在从CodeRanch读取一个线程,说抽象方法无法同步,因为抽象类无法实例化,这意味着没有锁定对象。 这没有意义,因为抽象类是子类的定义(契约)。 子进程的同步方法的抽象定义不需要锁定。 所有抽象标题都表明孩子必须同步这个方法。 我的逻辑是否正确? 如果没有,有人可以解释为什么我错了吗?

同步函数和同步块之间有什么区别?

有什么区别 public synchronized void addition() { //something; } 和 public void addtion() { synchronized (//something) { //something; } } 如果我错了,请忽略这个问题。

Java等效的.NET的ManualResetEvent和WaitHandle

我想知道Java是否提供了类似于.NET的ManualResetEvent和WaitHandle类,因为我想编写阻止给定超时的代码,除非触发事件。 WaitHandle和ManualResetEvent的.NET类为我提供了一个很好的,无障碍的接口,据我所知也是线程安全的,所以Java提供了什么?

锁定特定对象的Java线程

我有一个Web应用程序,我正在使用Oracle数据库,我有一个基本上像这样的方法: public static void saveSomethingImportantToDataBase(Object theObjectIwantToSave) { if (!methodThatChecksThatObjectAlreadyExists) { storemyObject() //pseudo code } // Have to do a lot other saving stuff, because it either saves everything or nothing commit() // pseudo code to actually commit all my changes to the database. } 现在没有任何类型的同步,所以n个线程当然可以自由地访问这个方法,当2个线程进入这个方法同时检查时会出现问题,当然还没有任何东西,然后他们都可以提交事务,创建重复的对象。 我不想在我的数据库中使用唯一的密钥标识符来解决这个问题,因为我认为我不应该捕获那个SQLException 。 我也无法在提交之前检查,因为有几个检查不仅1 ,这将花费相当多的时间。 我对锁和线程的体验是有限的,但我的想法基本上是将这个代码锁定在它接收的对象上。 我不知道例如说我收到一个整数对象,并且我用值1锁定我的整数,这只会阻止具有值为1的另一个Integer的线程进入,而所有其他具有value != 1线程都可以自由进入?,这是怎么回事? 此外,如果这是它的工作原理,锁对象如何比较? 它是如何确定它们实际上是同一个对象的? […]

Java:懒惰初始化单例

创建单身人士的模式似乎是这样的: public class Singleton { private static final Singleton instance = new Singleton(); private Singleton(){ } public static Singleton getInstance() { return instance; } } 但是我的问题是,如果Singleton构造函数执行不是unit testing友好的事情,例如调用外部服务,jndi查找等,你如何使用这样的类。 我想我可以重构它: public class Singleton { private static Singleton instance; private Singleton(){ } public synchronized static Singleton getInstance() { if(instance == null) instance = new Singleton(); return instance; } […]

为什么这个同步方法没有按预期工作?

有人可以解释两个我为什么这些代码不输出相同的结果(两个代码之间的唯一区别在于run()方法)? 注意:第一个代码似乎没有做任何锁定! 第一个代码: class LetterThread extends Thread { private StringBuffer letter; public static void main(String[] args) { StringBuffer sbltr = new StringBuffer(“A”); LetterThread one = new LetterThread(sbltr); LetterThread two = new LetterThread(sbltr); LetterThread three = new LetterThread(sbltr); one.setName(“Thread ONE”); two.setName(“Thread TWO”); three.setName(“Thread THREE”); one.start(); two.start(); three.start(); } LetterThread(StringBuffer letter) { this.letter = letter; } public […]