原创

线程

Run() start的区别

https://www.cnblogs.com/wihainan/p/4765862.html

sleep()不会释放锁

B进入锁池 A进入等待池中

锁池和等待池都是针对对象而言

  private volatile boolean go = false;
    public static void main(String args[]) throws InterruptedException {
        final NotificationDemo test = new NotificationDemo();

        Runnable waitTask = new Runnable(){

            @Override
            public void run(){
                try {
                    test.shouldGo();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " finished Execution");
            }
        };

        Runnable notifyTask = new Runnable(){

            @Override
            public void run(){
                test.go();
                System.out.println(Thread.currentThread().getName() + " finished Execution");
            }
        };

        Thread t1 = new Thread(waitTask, "WT1"); //will wait
        Thread t2 = new Thread(waitTask, "WT2"); //will wait
        Thread t3 = new Thread(waitTask, "WT3"); //will wait
        Thread t4 = new Thread(notifyTask,"NT1"); //will notify

        //starting all waiting thread
        t1.start();
        t2.start();
        t3.start();

        //pause to ensure all waiting thread started successfully
        Thread.sleep(200);

        //starting notifying thread
        t4.start();

    }
    /*
     * wait and notify can only be called from synchronized method or bock
     */
    private synchronized void shouldGo() throws InterruptedException {
        while(go != true){
            System.out.println(Thread.currentThread()
                    + " is going to wait on this object");
            wait(); //release lock and reacquires on wakeup
            System.out.println(Thread.currentThread() + " is woken up");
        }
        go = false; //resetting condition
    }

    /*
     * both shouldGo() and go() are locked on current object referenced by "this" keyword
     */
    private synchronized void go() {
        while (go == false){
            System.out.println(Thread.currentThread()
                    + " is going to notify all or one thread waiting on this object");

            go = true;   //making condition true for waiting thread
            notify();  // only one out of three waiting thread WT1, WT2,WT3 will woke up
            //notifyAll(); // all waiting thread  WT1, WT2,WT3 will woke up
        }

    }
Thread[WT2,5,main] is going to wait on this object
Thread[WT1,5,main] is going to wait on this object
Thread[WT3,5,main] is going to wait on this object
Thread[NT1,5,main] is going to notify all or one thread waiting on this object
NT1 finished Execution
Thread[WT2,5,main] is woken up
WT2 finished Execution

只是暗示并不是强制

Thread.yield(); 对锁没有影响  并不会让出锁

非常暴力 不安全

public static void main(String[] args) throws InterruptedException {
    Runnable interruptTask = new Runnable() {
        @Override
        public void run() {
            int i = 0;
            try {
                //在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程
                while (!Thread.currentThread().isInterrupted()) {
                    Thread.sleep(100); // 休眠100ms
                    i++;
                    System.out.println(Thread.currentThread().getName() + " (" + Thread.currentThread().getState() + ") loop " + i);
                }
            } catch (InterruptedException e) {
                //在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)
                System.out.println(Thread.currentThread().getName() + " (" + Thread.currentThread().getState() + ") catch InterruptedException.");
            }
        }
    };
    Thread t1 = new Thread(interruptTask, "t1");
    System.out.println(t1.getName() +" ("+t1.getState()+") is new.");

    t1.start();                      // 启动“线程t1”
    System.out.println(t1.getName() +" ("+t1.getState()+") is started.");

    // 主线程休眠300ms,然后主线程给t1发“中断”指令。
    Thread.sleep(300);
    t1.interrupt();
    System.out.println(t1.getName() +" ("+t1.getState()+") is interrupted.");

    // 主线程休眠300ms,然后查看t1的状态。
    Thread.sleep(300);
    System.out.println(t1.getName() +" ("+t1.getState()+") is interrupted now.");
}

http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/

在解释轻量级锁的执行过程之前,先明白一点,轻量级锁所适应的场景是线程交替执行同步块的情况,如果存在同一时间访问同一锁的情况,就会导致轻量级锁膨胀为重量级锁

局部变量:线程安全

        每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

如何理解上面这句话:

        局部变量(方法内部的私有变量)是线程安全的,如下段代码中的num这个私有变量是线程安全的,原因是在new HasSelfPrevateNum()这个类的时候它只会为类中的属性成员变量开辟空间,而方法只在方法区开辟一个内存空间并且只存一份是共用的代码段(变量在堆区,引用在栈区),而方法中的私有变量不会先开辟出内存空间,而是等调用时在对应调用线程中为方法中的变量申请空间,所以有几个线程调用则每个线程就会在自己的线程空间的栈为局部变量申请几个引用同时在堆中为变量再申请对应的空间(即方法内的私有变量有几个线程就在栈中申请几个引用,在堆中申请几个空间),所以多线程在调用时只会处理自己线程内的方法的私有变量,因此,方法内的私有变量是线程安全的。

如:

public class HasSelfPrivateNum {
    
    public void addI(String username)
    {
        try
        {
            int num = 0;
            if(username.equals("a"))
            {
                num = 100;
                System.out.println("a set over !");
                Thread.sleep(2000);
            }
            else
            {
                num = 200;
                System.out.println("b set over !");
            }
            System.out.println(username + " num = " + num);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spark

    最后,关闭 Spark 可以调用 SparkContext 的 stop() 方法,或者直接退出应用(比如通过

    大学里的混子
  • 线程

    在创建线程时,必须要建立一个Thread类的或其子类的实例。因此,我们不难想到在调用start方法之前通过线程类的构造方法将数据传入线程。并将传入的数据使用类变...

    大学里的混子
  • BTree

    大学里的混子
  • 视频流媒体平台EasyNVR能否在分享界面修改显示方式?

    我们的EasyNVR流媒体平台可以将局域网/广域网上的海康/大华等网络摄像头由rtsp转换为rtmp、rtsp、hls、flv协议转换,并提供推流服务,可以将拉...

    EasyNVR
  • 从香农说起

    我在大学上量子物理的时候,觉得这门课公式繁多,一度不愿意去学习。直到后来我看到近代量子物理的发展简史,才感受到其中的美妙。那是一种人文与科学的交织,我深深陶醉...

    故事尾音
  • Spring MyBatis多数据源分包

    创建基本的entity service dao 不同的数据源创建不同的包 我这里为了分辨 一个用的是Mysql 一个是Oracle 方便测试,

    試毅-思伟
  • 四个类搞定分层自动化测试框架

    我们刚开始做自动化测试,可能写的代码都是基于原生写的代码,看起来特别不美观,而且感觉特别生硬。

    软件测试君
  • 17 Python 基础: 重点知识点--Pygame实现儿时经典游戏坦克大战

    本文首发于腾讯云+社区,也可关注微信公众号【离不开的网】支持一下,就差你的关注支持了。

    小Gy
  • kali安装KatanaFramework

    个人博客:https://suveng.github.io/blog/​​​​​​​

    suveng
  • 程序员,你还不会合理选择Filter、Interceptor、Aspect?

    小伙伴们应该听说过过滤器、拦截器、切面,印象上都能够起到截断拦截的作用,在做一些业务需求时,不知道如何选择,今天老顾就来介绍一下他们之间的区别。

    淡定的蜗牛

扫码关注云+社区

领取腾讯云代金券