如何在多线程环境中避免同步?

时间:2011-02-28 09:35:08

标签: java multithreading synchronization

由于共享代码,我面临与多线程相关的一个问题。我想避免同步。我看到了很多与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());
}}

任何帮助都非常适合。

谢谢, 拉杰什

3 个答案:

答案 0 :(得分:4)

避免同步的一种方法是使每个资源不可变,这将由多个线程访问。使类/对象不可变确保其线程安全。

答案 1 :(得分:1)

如何根据情况避免同步。由于您的情况是人为的,并且没有做任何需要锁定的事情,最简单的方法是取消锁定,即只在需要时锁定。 (同时删除不执行任何操作的长循环)然后您的应用程序将运行得更快。

答案 2 :(得分:0)

尝试避免同步块的两个主要原因是性能并保护自己免受死锁。

使用synchronize关键字涉及设置锁定和保护同步操作的性能开销。虽然调用同步块会有性能损失,但当JVM必须管理该块的资源争用时,会有更大的打击。

java.util.concurrent.atomic中的类可以使用机器级原子指令而不是锁定,这使得它们比使用锁的代码快得多。有关其工作原理的详细信息,请参阅javadoc for the package

此外,正如u3050所提到的,避免可变共享状态对于防止同步的需要还有很长的路要走。