java核心-多线程-零碎知识收集

1.不能使用Integer作为并发锁

    原因:synchronized(Integer)时,当值发生改变时,基本上每次锁住的都是不同的对象实例,想要保证线程安全,推荐使用AtomicInteger之类会更靠谱。使用System.identityHashCode(obj)可以得到根据物理地址算出的hash值。

2.notify()和wait()新认知

    notify()是唤醒等待线程,不唤醒的话,即使锁已经空出来了,线程也不会知道去获取;
    wait()是放弃当前锁,进入睡眠状态,下次唤醒执行开始的地方;

3.两个线程交替打印奇偶数,打印对象必须使用AtomicInteger

package example;

import java.util.concurrent.atomic.AtomicInteger;

public class Exercise {

    static volatile Integer num = new Integer(0);   //这里即使是volatile也不行,必须使用AtomicInteger

    public static void main(String[] args){

        Object o1 = new Object();
        Thread t1 = new MyThread(num,true,o1);
        Thread t2 = new MyThread(num,false,o1);
        t1.start();
        t2.start();

    }

    public static class MyThread extends Thread{

        public Integer num;

        public boolean flag;

        public Object o1;


        public MyThread(Integer num, boolean flag, Object o1){
            this.num = num;
            this.flag = flag;
            this.o1 = o1;
        }

        @Override
        public void run(){
            System.out.println(getName() + "线程启动:" + flag);
            while (true){
                if(flag){
                    synchronized (o1){
                        if(num > 100){
                            System.out.println(getName() + " over");
                            break;}
                        if(num % 2 == 0){

                            System.out.println("打印偶数的线程,打印了:"+num);
                            num++;
                            o1.notify();
                            try {
                                o1.wait();
                            }catch (Exception e){}
                        }
                    }
                }
                if(!flag){
                    synchronized (o1){
                        if(num % 2 != 0){
                            if(num > 100){
                                System.out.println(getName() + " over");
                                break;
                            }
                            num++;
                            o1.notify();
                            try {
                                o1.wait();
                            }catch(Exception e){
                            }
                        }
                    }
                }
            }
        }
    }
}
总结,在Integer值发生变化时,会生成新的对象

4.Timer类使用

https://www.cnblogs.com/jmcui/p/7519759.html

5.Quartz框架使用

https://blog.csdn.net/noaman_wgs/article/details/80984873  //使用了解demo,很好
https://www.cnblogs.com/davidwang456/p/3878625.html   //源码方面

6.Elastic-job框架使用

详解当当网的分布式作业框架 elastic-job(https://www.infoq.cn/article/dangdang-distributed-work-framework-elastic-job/)
        详解当当网的分布式作业框架 elastic-job(https://www.infoq.cn/article/dangdang-distributed-work-framework-elastic-job/),张亮介绍的
        Elastic Job 入门详解(https://blog.csdn.net/zhglance/article/details/55213466),简单demo
        Elastic-Job开发指南(https://blog.csdn.net/tanga842428/article/details/52890188),基本demo
        Elastic Job技术详解(https://blog.csdn.net/adi851270440/article/details/80493367)

7.分布式任务调度方案相关文章

    分布式调度任务解决方案综合介绍文章(https://www.cnblogs.com/anyehome/p/8478926.html)

你可能感兴趣的:(java核心-多线程-零碎知识收集)