Tag: 线程线程安全

静态变量的线程安全性

class ABC implements Runnable { private static int a; private static int b; public void run() { } } 我有一个如上所述的Java类。 我有这个类的多个线程。 在run()方法中,变量a和b每次递增几次。 在每个增量上,我将这些变量放在Hashtable中。 因此,每个线程都会增加两个变量并将它们放在Hashtable中。 如何使这些操作线程安全?

停止非循环Java线程

这可能是我误解我所读到的内容的一个例子,但是用Java杀死一个线程的所有例子似乎表明你必须发出一个线程来自杀; 没有一些严重的风险,你不能从外面杀死它。 问题是,所有关于如何“礼貌地”要求线程死亡的例子都有某种循环,所以你要做的就是在每次迭代时都看一个标志。 所以,我得到的是一个线程,它只需要一段时间(一系列SQL查询)。 我当然可以在每一步之后进行检查,但它们不是在一个循环中,并且我没有一种非常优雅的方式可以解决这个问题。 这是我正在做的一个例子: new Thread(new Runnable(){ public void run(){ //query 1 Connection conn = db.getConnection(); Statement s = conn.createStatement(); ResultSet rs = s.executeQuery(“SELECT …”); while(rs.next()){ //do stuff } //query 2 rs = s.executeQuery(“SELECT …”); while(rs.next()){ //do stuff } //query 3 rs = s.executeQuery(“SELECT …”); while(rs.next()){ //do stuff } } }).start(); 这是一个例子,我不使用匿名内部类,但它说明我的run()方法不能优雅地停止自己。 此外,即使我在每个步骤之后检查,如果特定查询需要很长时间才能运行,则此代码将无法在查询完成之后停止。 […]

线程安全框架

以下类不是线程安全的( certificate以下代码不是线程安全的certificate ) 是否有一个框架可以帮助编译时/运行时分析并告诉我们以下是不是线程安全的? 对于编译时间,理想情况下在Eclipse中出现了摇摆下划线并告诉我们该类不是线程安全的? 对于运行时,任何静态代码分析是否会将该类捕获为非线程安全的? public class LazyInitRace { private ExpensiveObject instance = null; public ExpensiveObject getInstance() { if (instance == null) instance = new ExpensiveObject(); return instance; } }

不能访问封闭的类型实例。

整个代码是: public class ThreadLocalTest { ThreadLocal globalint = new ThreadLocal(){ @Override protected Integer initialValue() { return new Integer(0); } }; public class MyThread implements Runnable{ Integer myi; ThreadLocalTest mytest; public MyThread(Integer i, ThreadLocalTest test) { myi = i; mytest = test; } @Override public void run() { System.out.println(“I am thread:” + myi); Integer myint = […]

是java.util.UUID线程安全吗?

由于以下观察,我问这个问题 在高度multithreading环境中的线程转储中获取此堆栈跟踪 “http-80-200” daemon prio=10 tid=0x00002aaab4981000 nid=0x7520 waiting \ for monitor entry [0x000000004fec7000] java.lang.Thread.State: BLOCKED (on object monitor) at java.security.SecureRandom.nextBytes(SecureRandom.java:433) – waiting to lock (a java.security.SecureRandom) at java.util.UUID.randomUUID(UUID.java:162) 找到了这个链接 http://bugs.sun.com/view_bug.do?bug_id=6611830 如果UUID不是线程安全的,请建议任何其他库(如果存在)。

Java中的方法参数是否安全?

Class Shared{ public void sharedMethod(Object o){ //does something to Object } } //this is how threads call the shared method run(){ sharedInstance.sharedMethod(someObject); } 现在将o作为参数传递给方法。 多个线程并行调用相同的方法。 我们可以安全地说这段代码是线程安全的吗? 有两种情况: 如果someObject在线程之间共享 如果每个Thread都有自己的someObject副本

Java等待和notifyAll:IllegalMonitorStateException

我是Java新手(和RoR开发人员)。 我有一个简单的程序。 球是共享的球员。 球应该传递给随机球员。 好的,这里是代码: class Ball { private int currentPlayer; public void setCurrentPlayer( int currentPlayer, int fromWho ) { this.currentPlayer = currentPlayer; System.out.println( “Ball:setCurrentPlayer ” + fromWho + ” —> ” + currentPlayer ); } public int getCurrentPlayer() { return currentPlayer; } } class Player implements Runnable { private int myID; private Ball ball; […]

为什么我收到IllegalMonitorStateException?

当我尝试解锁一个对象时,我得到以下exception。 Exception in thread “Thread-1” java.lang.IllegalMonitorStateException at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(Unknown Source) at java.util.concurrent.locks.ReentrantLock.unlock(Unknown Source) at Pipe.unlock(Pipe.java:21) at Station.doWork(Station.java:81) at Station.run(Station.java:66) at java.lang.Thread.run(Unknown Source) Pipe.unlock所做的就是以下内容: public void unlock(){ accessLock.unlock(); } 其中accessLock是ReentrantLock 你知道问题出在哪里吗? 编辑: 这是Station中的run方法 if(Pipes[inConnection].accessLock.tryLock()){ System.out.println(“Station “+ StationNumber+”: granted access to pipe “+inConnection+”.”); //This is just a way for me to keep track if both […]

特定线程数

我想知道特定Thread类有多少活动线程。 假设我有一个T类扩展线程。 在其他一些类(Ex:Demo)中,我想得到T类Thread的线程数。 我知道Thread.activeCount()方法,但它将获得一个线程组的计数。 它不能满足我的需求。 假设我有T1和T2类扩展线程,在Demo类中我想得到多少T2活动线程。 我该怎么做到这一点? 有任何想法吗?? PS:我没有类T1和T2的源代码。 谢谢您的帮助。

这需要显式同步吗?

我有两个线程,我想确保我在LinkedBlockingQueue上正确进行同步..这是正确的吗? 或者是否必须在(messageToCommsQueue)上进行显式同步? 宣言: private LinkedBlockingQueue messagesToCommsQueue; 方法一: private void startOperationModeStatusMessageExecutor() { ScheduledExecutorService operationModeStatusExecutor = Executors.newSingleThreadScheduledExecutor(); operationModeStatusExecutor.scheduleAtFixedRate((new Runnable() { @Override public void run() { MT02OperationModeStatusMessage commsOperateMsg; commsOperateMsg = MessageFactory.getMT1102OperationModeStatusMessage(status.ordinal()); synchronized (messagesToCommsQueue) { messagesToCommsQueue.add(commsOperateMsg); } } }), 0, 10, TimeUnit.SECONDS); } 方法二: Executor commsSenderExecutor = Executors.newSingleThreadExecutor(); commsSenderExecutor.execute(new Runnable() { @Override public void run() { while (getStatus().equals(OperationModeStatus.INITIATE) || […]