Tag: 同步

Java同步方法…未同步

对于我目前的java练习,我必须从2个不同的Gmail帐户获取邮件。 我通过创建我的gmail类的新实例来完成此操作。 gmail类扩展了线程,在其中有一个同步方法readMail(),它获取邮件并打印它。 这个readMail方法由run方法在while(true)循环中调用,然后它hibernate30秒,这个想法是它每30秒获取一次邮件。 但是,synchronized方法似乎不起作用。 线程相互中断,并且该方法在其他线程中断并开始打印之前不会打印消息的所有项目。 任何建议将不胜感激。 请看下面给我带来麻烦的方法: public synchronized void readMail() throws MessagingException, IOException { Folder inbox = store.getFolder(“Inbox”); inbox.open(Folder.READ_ONLY); messages = inbox.getMessages(); // System.out.println(“No of Messages : ” + inbox.getMessageCount()); // System.out.println(“No of Unread Messages : ” // + inbox.getUnreadMessageCount()); for (int i = 0; i < inbox.getUnreadMessageCount(); i++) { System.out .println("*****************************************************************************"); System.out.println("NEW […]

在Java中,如何测试对象的监视器是否被锁定?

在Java中,如何测试对象的监视器是否被锁定? 换句话说,给定一个对象obj,是否有任何线程拥有obj的监视器? 我不关心哪个线程拥有显示器。 我需要测试的是,任何线程是否拥有给定对象的监视器。 由于当前线程以外的线程可能拥有监视器,因此Thread.holdsLock(obj)是不够的,因为它只检查当前线程。 我试图找到最简单的解决方案。 这不重复,因为: 我不能使用更高级别/更新的并发/锁定机制。 我不能使用Lock等。我必须使用低级/旧/传统货币/锁定机制,如synchronized,wait()等。 当监视器已解锁时,我并不是想找时间执行代码。 我试图在监视器被锁定时执行代码。 实际上,为了给出一点背景知识,我尝试启动的unit testing的这一部分运行两个线程,它们都需要锁定同一个对象。 因此,为了测试正确的并发处理。 我需要1.创建两个线程。 2.启动线程1. 3.一旦线程1拥有监视器,就挂起线程1. 4.启动线程2. 5.一旦线程2被线程1阻塞,挂起线程2. 6.恢复线程1。 7.加入线程1. 8.运行一些断言。 9.恢复线程2. 10.加入线程2. 11.运行一些断言。 我想弄清楚的是做#3的最佳方法,主要是确定线程1何时拥有监视器。

线程和同步方法

我有以下代码: public class MyThread extends Thread { private int i; public static int sum=0; public MyThread(int k){ i=k; } public static void main(String[] args) throws InterruptedException{ Thread t=new MyThread(1); Thread s=new MyThread(2); Thread p=new MyThread(3); t.start(); s.start(); } public synchronized void doSomething(){ for(int i=0; i<100000; i++){ System.out.println(this.i); } } @Override public void run() { doSomething(); […]

线程访问同步块/代码Java

我正在阅读同步工作。 这是一个例子: public class Singleton{ private static volatile Singleton _instance; public static Singleton getInstance(){ if(_instance == null){ synchronized(Singleton.class){ if(_instance == null) _instance = new Singleton(); } } return _instance; } 假设两个线程A和B正在访问getInstance(); 方法,如果线程A在synchronized块中,则线程B将跳过该块并执行下一个块/语句或将等待/阻塞,直到线程A离开synchronized块。 2什么是,为什么Singleton.class在synchronized参数中以及何时可以为null 以下Statement是真的吗? 内部锁在对象上: class A { public synchronized void method1(){…} public synchronized void method2(){…} } 如果线程A在method1则threadB无法进入method2或任何其他同步方法。

从Dropbox链接获取元数据而不使用身份validation

我想检查一个版本更改/获取文本文件的元数据与dropbox上的共享链接。 我不会使用dropbox api,因为它会让用户使用自己的帐户。 我希望他们链接到我的帐户,我不能手动执行,因为我可能会在以后更改我的密码。 所以:没有身份validation令牌,只需从dropbox的共享链接获取元数据,以便我可以检查版本更改,如果版本已更改,则下载新文件的内容。 另外:我也愿意接受其他建议来完成这项工作。 请详细解释一下您的解决方案。 更新的电子标签问题: public void getFromOnlineTxtDatabase(){ try{ URL url = new URL(“url-here”); HttpURLConnection.setFollowRedirects(true); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setDoOutput(false); con.setReadTimeout(20000); con.setRequestProperty(“Connection”, “keep-alive”); //get etag for update check String etag = con.getHeaderField(“etag”); //String etag= “”; con.setRequestProperty(“User-Agent”, “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0”); ((HttpURLConnection) con).setRequestMethod(“GET”); //System.out.println(con.getContentLength()) ; con.setConnectTimeout(5000); BufferedInputStream in […]

在函数中通过类名同步将在扩展类中有效吗?

我在基类中有一个方法foo使用Synchronized(类名),以及两个扩展基类的类A和B. 如果我从一个实例调用foo而两个不同线程中的B实例将被同步。 这是一个示例代码: class BaseClass { void foo() { synchronized(BaseClass.class) // do something like increment count } } class A extends BaseClass { } class B extends BaseClass { } A a = new A(); B b = new B(); //in thread 1 a.foo() ; //in thread 2 b.foo() ;

为NavigableMap编写同步的线程安全包装器

java.util.Collections目前提供以下实用程序方法,用于为各种集合接口创建synchronized包装器: synchronizedCollection(Collection c) synchronizedList(List list) synchronizedMap(Map m) synchronizedSet(Set s) synchronizedSortedMap(SortedMap m) synchronizedSortedSet(SortedSet s) 类似地,它还有6个unmodifiedXXX重载。 这里明显的遗漏是NavigableMap的实用方法。 它确实extends SortedMap ,但SortedSet extends Set , Set extends Collection ,而Collections则为SortedSet和Set提供了专用的实用方法。 据推测, NavigableMap是一个有用的抽象,或者它首先不存在,但它没有实用的方法。 所以问题是: Collections没有为NavigableMap提供实用程序方法的具体原因是什么? 你会如何为NavigableMap编写自己的synchronized包装器? 浏览OpenJDK版本的Collections.java的源代码似乎表明这只是一个“机械”过程 通常你可以像这样添加synchronized线程安全function吗? 如果是这样一个机械过程,它可以自动化吗? (Eclipse插件等) 这个代码重复是必要的,还是可以通过不同的OOP设计模式来避免?

Java 1.4同步:只允许一个方法实例运行(非阻塞)?

我有一个类提出翻译实用程序。 翻译本身应每30分钟重新加载一次。 我使用Spring Timer支持。 基本上,我的class级看起来像: public interface Translator { public void loadTranslations(); public String getTranslation(String key); } loadTranslations()可能需要很长时间才能运行,因此在运行时,旧的翻译仍然可用。 这是通过在本地Map中加载翻译并在加载所有翻译时更改参考来完成的。 我的问题是:我如何确保当一个线程已经加载翻译时,第二个也尝试运行,它会检测到并立即返回,而不开始第二次更新。 一个synchronized方法只会对负载进行排队……我还在Java 1.4上,所以没有java.util.concurrent。 谢谢你的帮助 !

AtomicBoolean与同步块有什么区别

我试图理解以下两个代码块之间的区别 AtomicBoolean ab = new AtomicBoolean(false); using the following to get and set state. . ab.get(); ab.set(X); vs. private boolean ab = false; private final Object myboollock = new Ojbect(); public void setAB(boolean state) { synchronized(myboollock) { ab = state; } } public boolean getAB() { synchronized(myboollock) { return ab; } } 我需要线程保护一个布尔值,就是所有,并且过去使用过后面的方法,但是想开始使用Atomic对象,(如果)它们是安全的吗?

使用同步块的Java中的并发性未给出预期结果

下面是一个简单的java程序。 它有一个名为“cnt”的计数器,它会递增,然后添加到名为“monitor”的List中。 “cnt”由多个线程递增,并且值被多个线程添加到“monitor”。 在方法“go()”的末尾,cnt和monitor.size()应该具有相同的值,但它们不具有相同的值。 monitor.size()确实有正确的值。 如果通过取消注释其中一个已注释的同步块来更改代码,并注释掉当前未注释的块,则代码会生成预期结果。 此外,如果将线程计数(THREAD_COUNT)设置为1,则代码会生成预期结果。 这只能在具有多个真实核心的机器上重现。 public class ThreadTester { private List monitor = new ArrayList(); private Integer cnt = 0; private static final int NUM_EVENTS = 2313; private final int THREAD_COUNT = 13; public ThreadTester() { } public void go() { Runnable r = new Runnable() { @Override public void run() { […]