码迷,mamicode.com
首页 > 其他好文 > 详细

010 使用synchronized完成同步

时间:2018-05-01 20:36:29      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:tst   count   inter   描述   方案   增加   row   创建   tar   

一 . 概述

  之前我们提到了线程并发出现的安全问题,最为简单的一种处理方案就是使用互斥锁.

    在java之中任何一个对象都可以作为一个互斥锁,这种互斥锁通常配合synchronized来使用.


 

二 . 测试用例

public class SyncTest {
    private static int count = 0;
    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(new Task());
        Thread t2 = new Thread(new Task());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("count =" + count);
    }
    
    private static class Task implements Runnable{
        @Override
        public void run() {
            for(int i = 0 ;i<100 ; i++) {
                try {
                    //此处使用睡眠增加错误的概率
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                add();
            }
        }
        
    }
    //每次递增1
    public static void add() {
        count++;
    }
}

上面的例子描述的问题很简单:

  创建一个方法,这个方法可以为一个共享变量不断的自增.

  现在创建两个线程完成对这个方法不断的调用,结果我们发现结果并不是希望的200.


 

三 . 问题的分析

  我们知道线程安全问题的出现需要的并要条件:

  [1]并发环境下

  [2]存在共享资源

  [3]对共享资源进行非原子的操作(读写操作).

解决这个问题的方式比较简单.

  我们将对共享资源的操作变成互斥的.

    就可以使用synchronized来完成.

我们将add()方法进行改造.  

//每次递增1
    public synchronized static void add() {
        count++;
    }

很简单的,我们自己需要在对共享变量操作的地方加上了同步修饰符就完成了.

010 使用synchronized完成同步

标签:tst   count   inter   描述   方案   增加   row   创建   tar   

原文地址:https://www.cnblogs.com/trekxu/p/8976753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!