java里线程同步方法一:同步线程块
来源:互联网 发布:网吧禁止吸烟广播软件 编辑:程序博客网 时间:2024/05/15 07:28
有时候使用多进程时会导致进程不同步,这样会导致运行结果的错误。
看下面的代码:
class ThreadDemo1 { public static void main(String[] args) { TestThread tt = new TestThread(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); }}class TestThread implements Runnable { int tickets = 100; public void run() { while (true) { if (tickets > 0) { try { Thread.sleep(10); } catch (Exception e) { } System.out.println(Thread.currentThread().getName() + " is saling ticket " + tickets--); } } }}
运行结果:
从运行结果可以看出最后输出了负数,因为当一个线程判断了tickets==1时(大于零),这时它睡眠了10毫秒,这时其他进程会没有判断就输出了票数,再将tickets–,这样就会导致输入负数。
要让它不会出错就要用到进程同步块synchronized。
修改代码如下:
class ThreadDemo1 { public static void main(String[] args) { TestThread tt = new TestThread(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); }}class TestThread implements Runnable { int tickets = 100; String str = new String(""); public void run() { while (true) { synchronized (str) { if (tickets > 0) { try { Thread.sleep(10); } catch (Exception e) { } System.out.println(Thread.currentThread().getName() + " is saling ticket " + tickets--); } } } }}
运行结果:
ynchronized的原理可以这样理解:当程序进入synchronized代码块时会检查对象(这里的对象是str,假设标志位为1运行,为0时阻塞)的标志位,如果为1时将标志位置0之后再运行,当标志位为0时阻塞等标志位为1。但synchronized同步代码块会影响运行速度。
注:String str = new String(“”);语句不能放在run方法里,因为每个线程运行都有自己的run方法,那么就会创建四个str对象,初始标志位都为1.
0 0
- java里线程同步方法一:同步线程块
- java 线程方法同步和同步块
- java线程同步方法,方法块区别
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步块
- Codeforces Round #346 (Div. 2) D. Bicycle Race(点在多边形内部)
- Windows官方将会内嵌Linux系统
- 九度oj 1120 递归(dfs)
- 解决The VMware Authorization Service is not run的情况
- 关于xcode——模拟器
- java里线程同步方法一:同步线程块
- POJ3253-Fence Repair
- BZOJ 1487: [HNOI2009]无归岛
- 大数据工程师技能图谱
- vs2013调试技巧及快捷键
- 2016春季练习——母函数
- Android MVP的学习
- log4j集成mongodb
- Linux操作系统下/etc/hosts文件配置方法