class MyThread implements Runnable{
private int ticket=10;
public void run(){
synchronized(this){
for(int i=0;i<100;i++){
if(ticket>0){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖掉第"+ticket--+"张票");
}
}
}
}
}
public class SynchronizedDemo{
public static void main(String args[]){
MyThread mt=new MyThread();
Thread t1=new Thread(mt,"窗口1");
Thread t2=new Thread(mt,"窗口2");
Thread t3=new Thread(mt,"窗口3");
t1.start();
t2.start();
t3.start();
}
}为什么只有一个窗口买票,而不是三个窗口同时买票,求大神分析一下线程同步
private int ticket=10;
public void run(){
synchronized(this){
for(int i=0;i<100;i++){
if(ticket>0){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖掉第"+ticket--+"张票");
}
}
}
}
}
public class SynchronizedDemo{
public static void main(String args[]){
MyThread mt=new MyThread();
Thread t1=new Thread(mt,"窗口1");
Thread t2=new Thread(mt,"窗口2");
Thread t3=new Thread(mt,"窗口3");
t1.start();
t2.start();
t3.start();
}
}为什么只有一个窗口买票,而不是三个窗口同时买票,求大神分析一下线程同步
synchronized(this){
这你不是加了锁了么。
锁住了这段代码,其他的线程就没法运行了吧
LZ把同步块家到下面这个位置:
synchronized (this) {
System.out.println(Thread.currentThread().getName() + "卖掉第"
+ ticket-- + "张票");
}
public void run(){
for(int i=0;i<100;i++){
if(ticket>0){
int tt = 0;
synchronized(this){
tt= ticket--;
}
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖掉第"+ tt +"张票");
}
}
}
ticket 定义改成
private volatile int ticket=10;
{
private int ticket=10;
public void run()
{ for(int i=0;i<10;i++) //建议不要将i的最大值设的太大这样太浪费资源
{
//先睡眠,后锁定,以便让其他线程进来
try
{
Thread.sleep(1000);
}catch(InterruptedException e){e.printStackTrace();}
//在进行售票时,需要进行锁定
synchronized(this)
{
if(ticket>0)
{
System.out.println(Thread.currentThread().getName()+"卖掉第"+ticket--+"张票");
}
}
}
}
}
public class SynchronizedDemo
{
public static void main(String args[])
{
MyThread mt=new MyThread();
Thread t1=new Thread(mt,"窗口1");
Thread t2=new Thread(mt,"窗口2");
Thread t3=new Thread(mt,"窗口3");
t1.start();
t2.start();
t3.start();
}
}
private int ticket = 10; public void run() {
while (ticket > 0) {//循环条件
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
if (ticket > 0) {//避免卖 -1 张票。
System.out.println(Thread.currentThread().getName() + "卖掉第"
+ ticket-- + "张票");
} else {
break;//退出
}
}
}
}
}public class SynchronizedDemo {
public static void main(String args[]) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt, "窗口1");
Thread t2 = new Thread(mt, "窗口2");
Thread t3 = new Thread(mt, "窗口3");
t1.start();
t2.start();
t3.start();
}
}