由于共享代码,我面临与多线程相关的一个问题。我想避免同步。我看到了很多与AtomicInteger相关的线程。信号。但是没有清楚地知道什么方式以及它是如何比同步更好的选择。
这是我想要使线程安全的简单代码。 用于创建线程的类。
public class ThreadCheck implements Runnable {
TestStaticVar var = new TestStaticVar();
@Override
public void run() {
// TODO Auto-generated method stub
try {
var.holdOn();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String args[]) {
ThreadCheck t = new ThreadCheck();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.setName("A");
t1.start();
t2.setName("B");
t2.start();
}}
由多个线程执行的类。
public class TestStaticVar {
Semaphore sem = new Semaphore(1);
public void holdOn() throws InterruptedException{
sem.acquire();
System.out.println("Inside Hold on....."+Thread.currentThread().getName()+"==> ");//+i.get());
try {
for (long i=0; i<Integer.MAX_VALUE; i++) {
}
System.out.println(var1.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Finished Hold on===="+Thread.currentThread().getName());
sem.release(1);
System.out.println("Execution Completed by =====> "+Thread.currentThread().getName());
}}
任何帮助都非常适合。
谢谢, 拉杰什
答案 0 :(得分:4)
避免同步的一种方法是使每个资源不可变,这将由多个线程访问。使类/对象不可变确保其线程安全。
答案 1 :(得分:1)
如何根据情况避免同步。由于您的情况是人为的,并且没有做任何需要锁定的事情,最简单的方法是取消锁定,即只在需要时锁定。 (同时删除不执行任何操作的长循环)然后您的应用程序将运行得更快。
答案 2 :(得分:0)
尝试避免同步块的两个主要原因是性能并保护自己免受死锁。
使用synchronize
关键字涉及设置锁定和保护同步操作的性能开销。虽然调用同步块会有性能损失,但当JVM必须管理该块的资源争用时,会有更大的打击。
java.util.concurrent.atomic
中的类可以使用机器级原子指令而不是锁定,这使得它们比使用锁的代码快得多。有关其工作原理的详细信息,请参阅javadoc for the package。
此外,正如u3050所提到的,避免可变共享状态对于防止同步的需要还有很长的路要走。