代码块与函数的同步
2016-03-31 13:39
405 查看
先看下面代码:
运行结果:
![](http://img.blog.csdn.net/20160331133851843)
从运行结果可以看出tickets有售出0号,所以没有同步,因为线程同步块使用的是str对象的标志位,而线程同步函数使用的是this(本类)对象的标志位。所以将synchronized(str)修改为synchronized(this)即可。
class ThreadDemo1 { public static void main(String[] args) { TestThread tt = new TestThread(); new Thread(tt).start(); try { Thread.sleep(1); } catch (Exception e) { } tt.str = new String("method"); new Thread(tt).start(); } } class TestThread implements Runnable { int tickets = 100; String str = new String(""); public void run() { if (str.equals("method")) { while (true) { sale(); } } else { while (true) { synchronized (str) { if (tickets > 0) { try { Thread.sleep(10); } catch (Exception e) { } System.out.println(Thread.currentThread().getName() + " is saling ticket " + tickets--); } } } } } public synchronized void sale() { if (tickets > 0) { try { Thread.sleep(10); } catch (Exception e) { } System.out.print("sale():"); System.out.println(Thread.currentThread().getName() + " is saling ticket " + tickets--); } } }
运行结果:
从运行结果可以看出tickets有售出0号,所以没有同步,因为线程同步块使用的是str对象的标志位,而线程同步函数使用的是this(本类)对象的标志位。所以将synchronized(str)修改为synchronized(this)即可。
相关文章推荐
- Java并发编程:synchronized
- 代码重构(二):类重构规则
- CUDA编程(三)评估CUDA程序的表现
- 2016/3/31 拾遗 php字符串中 转义字符 “ ’‘ ” ’ “” ‘ " \’ ' ' \‘ " " \" '' \ " " 使用
- Qt中调用VS编译dll的方法(一)----显式调用
- Spring学习记录1--@Transactional Propagation
- 代码优雅
- PHP cURL 应用
- php curl请求信息和返回信息设置代码实例,特别是在请求过程中存在重定向的时候获取请求返回头信息
- qt create 在windows下,不能debug
- java里线程同步方法二:同步函数
- C#基本功------委托和事件(一)
- java里线程同步方法一:同步线程块
- Asp.net中的PostBackUrl属性
- 代码重构(一):函数重构规则
- java大批量生成二维码
- C/C++中指向指针的指针传递函数
- 详解 QT 布局管理界面 图文并茂(1)
- java中多线程Runnable接口和Thread类的区别
- Java之正则表达式