首页 > 编程语言 > 详细

java线程同步 synchronized失效???(理解好是否上锁的是同一个对象)

时间:2021-05-20 10:01:31      阅读:29      评论:0      收藏:0      [点我收藏+]

java线程同步 synchronized失效???(理解好是否上锁的是同一个对象)

看是否给同一个对象上锁!

情况是1:多个线程执行同个对象,即多个运行任务的线程执行同一个任务对象

情况2:多个线程执行不同的多个对象,即多个运行任务的线程执行不同的多个任务对象

技术分享图片技术分享图片

 

 

技术分享图片

 

 

技术分享图片

 

 代码:

?ts 测试类

package eating;

public class ts {
      public static void main(String[] args){
          AppleNum appleNum = new AppleNum(20);
//          Apple apple = new Apple(appleNum);
          Apple[] apple = new Apple[5];
          String[] names = { "小红", "小黄", "小蓝", "小绿", "小青" };
          for(int i = 0; i < names.length; i++) {
              apple[i] = new Apple(appleNum);
              new Thread(apple[i], names[i]).start();
          }

      }
}

?AppleNum 苹果数量类

package eating;

public class AppleNum {
    /* 苹果数量 */
    int num;
    public AppleNum(int num) {
        this.num = num;
    }
    public int getNum() {
        return num;
    }
    public int setNum(int num2) {
        return num -= num2;
    }
}

?Apple 苹果类

package eating;

import java.util.concurrent.TimeUnit;

class Apple implements Runnable {

    private AppleNum appleNum;
    public Apple(AppleNum appleNum) {
        this.appleNum = appleNum;
    }
    @Override
    public void run() {
        while (true) {
            synchronized (this) {
                if (appleNum.getNum() > 0) {
                    appleNum.setNum(1);
                    System.out.println(Thread.currentThread().getName() + "拿了第" + appleNum.getNum() + "个苹果");
                    try {
                        TimeUnit.MILLISECONDS.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
}

 

ps:线程安全?非线程安全?什么是线程同步?

线程安全?线程不安全?

线程不安全:在不提供加锁机制保护时,出现了多个线程先后更新数据所得的数据是脏数据。举例子:买票时,如果不排队,抢着买票,A看到票数是100(B也马上看到了,在A买之前,B看到的票数也是100),A买了,则站在A的角度,这时候票数更新为99,然后B也来买,则站在B的角度,票数应该为99(因为B看到的票数是100). 明明被买了两张票,结果票数却是99.

什么是线程同步?~~ synchronized 关键字、线程加锁

线程同步:当线程们访问同一个共享资源时,需要通过线程同步机制,当第一个线程进去时,就把共享资源进行加锁,然后同步资源的状态给后边进去的线程。 线程同步的是把前一个线程更新后的状态传递给下一位线程。

? 线程同步其实实现的是线程排队防止线程同步访问共享资源造成冲突变量需要同步,常量不需要(常量存放于方法区)。

 

 

 

参考:

https://www.cnblogs.com/xrq730/p/6662232.html  

 

java线程同步 synchronized失效???(理解好是否上锁的是同一个对象)

原文:https://www.cnblogs.com/shan333/p/14788184.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!