多线程--基础篇2--同步
来源:互联网 发布:做优化代理 编辑:程序博客网 时间:2024/05/19 21:00
在两个线程共卖100张票的时候,也会出现问题,同时卖同一张票。
程序如下:
public class TestThread implements Runnable{ private int j=100; public void run(){ for(int i = 0 ;i<100;i++){ if(j>0){ try { Thread.sleep(300);//注意这里休眠了300毫秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("卖第"+j+"张票!"); j--; } } }} public static void main(String[] args) { TestThread m=new TestThread(); new Thread(m).start(); new Thread(m).start(); }
结果:
卖第100张票!
卖第100张票!
卖第98张票!
卖第98张票!
......
造成此问题的根本原因在于,判断剩余票数和修改票数之间加入了延迟操作。
如果想解决这样一个问题,就必须使用同步,所谓的同步就是指多个操作在同一时间段内只能有一个线程进行,其他线程要等待此线程完成之后才可以继续执行。
在Java中可以通过同步代码的方法进行代码的加锁操作,同步的实现由两种方式:同步代码块和同步方法
1. 同步代码块:使用synchronized关键字进行同步代码块的声明,但是在使用此操作时必须明确的指出到底要锁定的是哪个对象,一般都是以当前对象为主:
synchronized(对象){//一般都是将this进行锁定
需要同步的代码;
}
使用同步代码块修改之前的程序:
public class TestThread implements Runnable{ private int j=100; public void run(){ for(int i = 0 ;i<100;i++){ synchronized (this) {//同步代码块,要将if判断条件包括在其中,否则会出现卖出第0张票的问题 if(j>0){ try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("卖第"+j+"张票!"); j--; } } } }}
2. 同步方法:将要同步的代码块抽取成方法
public class TestThread implements Runnable { private int j = 100; public void run() { for (int i = 0; i < 100; i++) { sale(); } } public synchronized void sale() {//同步方法 if (j > 0) { try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("卖第" + j + "张票!"); j--; } }}
- 多线程--基础篇2--同步
- 多线程同步基础
- 多线程基础2-同步代码块、同步方法
- Java基础--多线程|线程同步
- 鸟菜基础篇2012_10_28多线程(二)线程同步
- 多线程同步技术-2
- C#多线程同步2
- Java多线程(2) 同步
- c#中多线程---线程同步基础
- C#中的多线程-线程同步基础
- C#中的多线程-线程同步基础
- C#中的多线程-线程同步基础
- linux基础编程 多线程同步 pthread_cond_signal
- linux基础编程 多线程同步 pthread_cond_signal
- 黑马程序员----JAVA基础多线程&同步
- [多线程之旅] 三、线程同步基础
- Java基础总结----多线程安全性&同步
- 操作系统基础及多线程/进程同步
- hibernate的getSession和getCurrentSession源码解析
- 磁盘管理——LVM
- 日语动词变形总结
- HDU 1075 What Are You Talking About
- hdu 2825 Wireless Password(AC自动机+压缩DP,5级)
- 多线程--基础篇2--同步
- 天乐文本文件按行分割器_v1.0正式版【专业制作&极速分割】
- Windows环境下搭建Qt开发环境
- win8中 用office 提示值不在预期的范围内
- Combinations
- 位操作-找到数组中只出现一次的数字
- 为你的记事本增加扩展新的功能
- Qt调用WebService 4
- Ubuntu & Fedora 使用积累