标签: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++; }
很简单的,我们自己需要在对共享变量操作的地方加上了同步修饰符就完成了.
标签:tst count inter 描述 方案 增加 row 创建 tar
原文地址:https://www.cnblogs.com/trekxu/p/8976753.html