JUC 相关

什么是线程安全?如何保证线程安全?

  • 线程安全:
    线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

  • 如何保证呢:
    1、使用线程安全的类;
    2、使用synchronized同步代码块,或者用Lock锁;

      > 由于线程安全问题,使用synchronized同步代码块
        原理:当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
        另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
    

   3、多线程并发情况下,线程共享的变量改为方法局部级变量;

启动线程的方法,线程是什么,怎么开启

进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。

获取线程的方法:
     //传统的是继承thread类和实现runnable接口,
     //java单继承,不应该继承Thread;
     new Thread(()->{}, name).start;
 
     //java5以后又有实现callable接口
     FutureTask<Integer> ft = new FutureTask<Integer>(new MyThread());
     new Thread(ft, "AA").start();
     ft.get();

 示例
        FutureTask<Integer> futureTask = new FutureTask(()->{
            System.out.println(Thread.currentThread().getName()+"  come in callable");
            TimeUnit.SECONDS.sleep(4);
            return 1024;
        });
        new Thread(futureTask,"zhang3").start();
        System.out.println(futureTask.get());
        //1、一般放在程序后面,直接获取结果
        //2、只会计算结果一次

在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。
 
一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。 
 
只计算一次    get方法放到最后

callable接口与runnable接口的区别?
 答:Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
       (1)是否有返回值
       (2)是否抛异常:call()方法可抛出异常,而run()方法是不能抛出异常的。 
       (3)落地方法不一样,一个是run,一个是call
       (4)运行Callable任务可拿到一个Future对象, Future表示异步计算的结果。 
  它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。 
  通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。 

     //java的线程池获得
    ExecutorService threadPool =  Executors.newFixedThreadPool(5); 
    ExecutorService threadPool =  Executors.newSingleThreadExecutor(); 
    ExecutorService threadPool =  Executors.newCachedThreadPool();     

 

 

 

 

 

 

参考
https://www.jianshu.com/p/19711e03f972
https://www.jianshu.com/p/3c5d7f09dfbd
posted @ 2020-04-30 19:13  zzmhust  阅读(144)  评论(0)    收藏  举报