其他分享
首页 > 其他分享> > 第三章同步与锁

第三章同步与锁

作者:互联网

1,线程安全问题

先看个例子:

package com.shanghai;

public class ThreadDemo implements Runnable{
    private  int ticket =  5 ;

    @Override
    public void run() {
        for(int i=1;i<=5;i++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
//            ticket--;
            
System.out.println("线程资源:"+i+"抢到买票张数:"+ticket--);
        }
    }

    public static void main(String[] args) {
        ThreadDemo  dd = new ThreadDemo();
        new Thread(dd).start();
        new Thread(dd).start();
        new Thread(dd).start();
//        new Thread(dd).start();
    }
}

其中一次的结果:


线程资源:1抢到买票张数:5
线程资源:1抢到买票张数:4
线程资源:1抢到买票张数:5
线程资源:2抢到买票张数:3
线程资源:2抢到买票张数:3
线程资源:2抢到买票张数:2
线程资源:3抢到买票张数:0
线程资源:3抢到买票张数:1
线程资源:3抢到买票张数:1
线程资源:4抢到买票张数:-3
线程资源:4抢到买票张数:-1
线程资源:4抢到买票张数:-2
线程资源:5抢到买票张数:-5
线程资源:5抢到买票张数:-4
线程资源:5抢到买票张数:-6
 

以上结果不做说明,每次运行结果都不一样,有兴趣的伙伴可以自测。

但是 通过以上自测结果我们可以看出,起的多个线程对同一资源使用时会有竞争关系,要想让票个张数一张一张减少,用多线程模拟多用户买票处理那就需要同步了,同步是什么,是指同一时间段内只有一个线程运行。

以上代码 

测试启动一个线程

  public static void main(String[] args) {
        ThreadDemo  dd = new ThreadDemo();
        new Thread(dd).start();
//        new Thread(dd).start();
//        new Thread(dd).start();
//        new Thread(dd).start();
    }

结果如下:

线程资源:1抢到买票张数:5
线程资源:2抢到买票张数:4
线程资源:3抢到买票张数:3
线程资源:4抢到买票张数:2
线程资源:5抢到买票张数:1

要想多线程使用如单线程使用那样 ,就需要在一个时间段内锁着需要执行的部分。

一般有同步代码块和同步方法两种方式

这就用到了一个关键字锁:synchronized

代码片段如:

for(int i=1;i<=5;i++){
            synchronized (this) {
                if(ticket>0) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
//            ticket--;
                    System.out.println("线程资源:" + i + "抢到买票张数:" + ticket--);
                }
            }
        }

结果如下:

线程资源:1抢到买票张数:5
线程资源:2抢到买票张数:4
线程资源:3抢到买票张数:3
线程资源:4抢到买票张数:2
线程资源:5抢到买票张数:1

使用加载到同步方法上的如下:

for(int i=1;i<=5;i++){

    this.getResult(i);

}

 public synchronized  void getResult(int jj){
        if(ticket>0) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
//            ticket--;
            System.out.println("线程资源:" + jj + "抢到买票张数:" + ticket--);
        }
    }

结果如下:

线程资源:1抢到买票张数:5
线程资源:2抢到买票张数:4
线程资源:3抢到买票张数:3
线程资源:4抢到买票张数:2
线程资源:5抢到买票张数:1

以上是通过加synchorized关键字达到的效果。但是有一种情况会让这同步造成都相互等待问题。那这个是什么情况呢?敬请期待。

标签:同步,第三章,Thread,张数,抢到,线程,买票,资源
来源: https://blog.csdn.net/zhangxiaopihai_xujia/article/details/119192313