java 多线程操作同一个变量
2013-12-17 11:32
597 查看
例子,假设是个卖票系统,多个线程(例子中有2个线程)操作同一个变量ticketCount(余票的数量)。
Expected : 多个线程对同个变量会同步操作,不会造成混乱。
public class Test implements Runnable {
private String threadName;
private int ticketCount;
public Test(String threadName, int ticketCount) {
this.threadName = threadName;
this.ticketCount = ticketCount;
}
public synchronized int sellTicket() {
return ticketCount--;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (ticketCount > 0) {
System.out.println(getThreadName() + " : " + sellTicket());
}
}
public String getThreadName() {
Thread a = Thread.currentThread();
return a.getName();
}
public static void main(String[] args) {
Test t1 = new Test("Ticket available ", 10);
Thread thread1 = new Thread(t1,
"1 window sell ticket ,ticket available ");
Thread thread2 = new Thread(t1,
"2 window sell ticket ,ticket available ");
thread1.start();
thread2.start();
}
}
----------------------打印结果(每次运行不一样)----------------------
2 window sell ticket ,ticket available : 9
2 window sell ticket ,ticket available : 8
2 window sell ticket ,ticket available : 7
2 window sell ticket ,ticket available : 6
2 window sell ticket ,ticket available : 5
2 window sell ticket ,ticket available : 4
1 window sell ticket ,ticket available : 10
2 window sell ticket ,ticket available : 3
1 window sell ticket ,ticket available : 2
2 window sell ticket ,ticket available : 1
Expected : 多个线程对同个变量会同步操作,不会造成混乱。
public class Test implements Runnable {
private String threadName;
private int ticketCount;
public Test(String threadName, int ticketCount) {
this.threadName = threadName;
this.ticketCount = ticketCount;
}
public synchronized int sellTicket() {
return ticketCount--;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (ticketCount > 0) {
System.out.println(getThreadName() + " : " + sellTicket());
}
}
public String getThreadName() {
Thread a = Thread.currentThread();
return a.getName();
}
public static void main(String[] args) {
Test t1 = new Test("Ticket available ", 10);
Thread thread1 = new Thread(t1,
"1 window sell ticket ,ticket available ");
Thread thread2 = new Thread(t1,
"2 window sell ticket ,ticket available ");
thread1.start();
thread2.start();
}
}
----------------------打印结果(每次运行不一样)----------------------
2 window sell ticket ,ticket available : 9
2 window sell ticket ,ticket available : 8
2 window sell ticket ,ticket available : 7
2 window sell ticket ,ticket available : 6
2 window sell ticket ,ticket available : 5
2 window sell ticket ,ticket available : 4
1 window sell ticket ,ticket available : 10
2 window sell ticket ,ticket available : 3
1 window sell ticket ,ticket available : 2
2 window sell ticket ,ticket available : 1
相关文章推荐
- java多线程实战( 多个线程 修改同一个变量)
- java进阶(七)------多线程---多线程操作同一变量
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
- java进阶(七)------多线程---多线程操作同一变量
- 用Java写一个多线程程序,如写四个线程,二个加1,二个对一变量减一,输出:
- Java多线程操作局部变量与全局变量
- 一个非常简单的缓冲—使用Java5提供的读写锁处理多线程操作
- Java多线程复习与巩固(八)--原子性操作与原子变量
- java多线程读一个变量需要加锁吗?
- solr中一个问题——顺便讨论java中关于中包括main函数以及涉及资源(变量)操作中的类
- 多线程操作同一个变量
- 用Java写一个多线程程序,如写四个线程,二个加1,二个对一变量减一,输出:
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
- 用java写一个多线程程序,其中两个对一个变量加1,另两个对一个变量减1
- 多线程操作一个变量示例
- java多线程环境下对变量的读写操作的原子性问题
- 【Java多线程与并发库】05 线程范围内共享变量ThreadLocal
- java一个多线程的经典例子
- 多线程 《多线程操作同一变量》
- 多线程下变量-原子操作 sync_fetch_and_add等等