java - 对于多线程共享资源,同步是更好的选择吗?

标签 java multithreading synchronized

public class MyResource {

private int count = 0;

void increment() {

    count++;

}

void insert() {    // incrementing shared resource count
    for (int i = 0; i < 100000000; i++) {
        increment();
    }

}

void insert1() {       //incrementing shared resource count
    for (int i = 0; i < 100000000; i++) {
        increment();
    }

}

void startThread() {

    Thread t1 = new Thread(new Runnable() {  //thread incrementing count using insert()

        @Override
        public void run() {
            insert();
        }
    });

    Thread t2 = new Thread(new Runnable() {    //thread incrementing count using insert1()

        @Override
        public void run() {
            insert1();
        }
    });

    t1.start();
    t2.start();

    try {
        t1.join(); //t1 and t2 race to increment count by telling current thread to wait
        t2.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

void entry() {
    long start = System.currentTimeMillis();
    startThread();            //commenting insert(); insert1() gives output as time taken = 452(approx)   110318544  (obvious)

    // insert(); insert1();     //commenting startThread() gives output as time taken = 452(approx)   200000000

    long end = System.currentTimeMillis();
    long time = end - start;
    System.out.println("time taken = " + time);

    System.out.println(count);
}

}

程序入口点来自entry()方法。

1.仅使用insert(); insert1(); (调用的普通方法)并注释执行线程的startThread()会给我结果,如代码所示。

2.现在评论insert(); insert1();并使用startThread()(执行线程)给我结果,如代码所示。

3.现在我同步increment()给我输出的时间= 35738 200000000

如上,同步避免了共享资源的访问,但是另一方面,它花费了大量的时间来处理。

那么,如果这种同步降低了性能,又有什么用呢?

最佳答案

有时,您只希望同时进行两项或多项操作。想象一下,在长时间任务运行时,聊天应用程序的服务器或更新GUI的程序可以使用户知道正在进行的处理

关于java - 对于多线程共享资源,同步是更好的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30154336/

相关文章:

java - 为什么这个空的同步块(synchronized block)会影响程序的输出?

java - 从非同步方法内部调用同步

java - java中同步输出不正确

java - 如何防止使用hibernate连接mysql时出现mysql wait_timeout?

java - 使用项目作为库,但需要更改 contentView

c - 如何使用线程读写串口数据

java - 我的服务线程安全吗?

java - 继承:从子类访问基类字段

java - 如何从 .yml 文件正确加载 HashMap?

java - JCIP 书中定义的 core java 内部 protected 对象的示例