day19-线程不安全--线程同步机制:锁机制

25 篇文章 0 订阅
2 篇文章 0 订阅
  1. 并行:指两个或多个事件在同一时刻点发生;
    并发:指两个或多个事件在同一时间段内发生。
  2. 并发性是指在一段时间内宏观上有多个程序在同时运行

    线程也是一样的,JVM线程调度随机性。

  3. 进程是指一个内存中运行中的应用程序。每个进程都有自己独立的一块内存空间,进程间通信很不方便,一个应用程序可以同时启动多个进程。一个进程至少有一个线程
    多进程:操作系统中同时运行的多个程序。
    多线程:在同一个进程中同时运行的多个任务。

    多任务系统,允许多个任务,每一个任务就是一个进程,每一个进程也可以同时执行多个任务,每一个任务就是线程。

    进程与线程的区别:
    进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。
    线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以通信,一个进程中的多个线程是并发运行的。Java程序的进程里至少包含主线程和垃圾回收线程(后台线程)。

  4. 多线程作为一种多任务、并发的工作方式,优势:
    ①  进程之前不能共享内存,而线程之间共享内存(堆内存)则很简单。
    ② 系统创建进程时需要为该进程重新分配系统资源,创建线程则代价小很多,
    ③ Java语言本身内置多线程功能的支持
    多线程是为了同步完成多项任务,不是为了提高程序运行效率,但是却通过提高资源使用效率来提高系统的效率。

  5. 在Java代码中如何去运行一个进程
      方式1:Runtime类的exec方法:
      方式2:ProcessBuilder的start方法

  6. 创建和启动线程,传统有两种方式:
    方式1:继承Thread类;
    方式2:实现Runnable接口;
    ----------------------------------------------------------------
    线程类: Thread类和Thread的子类才能称之为线程类. 别忘了主线程(main方法,表示主线程).

  7. 方式1:继承Thread类:
                              

    注意:如果调用run方法好比是对象调用方法,依然还是只有一个线程(main线程),并没有开启新的线程.

  8. 方式2:实现Runnable接口;

     

    1. 使用匿名内部类来创建线程:

      吃苹果比赛

    2. 继承方式和实现方式的区别:实现方式能共享资源
      继承方式:  因为 每个new Person都是一个线程,都有各自的苹果
      实现方式:  虽然每个new  Thread都是一个线程,他们共享一个new Apple()      

    3. 要解决多线程并发访问同一个资源的线程安全性问题:保证线程同步进行(原子操作) -----锁机制
       A线程进入操作的时候,B和C线程只能在外等着,A操作结束,A和B和C才有机会进入代码去执行.
      方式1:同步代码块
      方式2:同步方法
      方式3:锁机制(Lock)

    4. 同步代码块:
      synchronized(同步锁)
      {
           需要同步操作的代码
      }
      同步锁:
      为了保证每个线程都能正常执行原子操作,Java引入了线程同步机制.
      同步监听对象/同步锁/同步监听器/互斥锁:
      一般的,我们把当前并发访问的共同资源作为同步监听对象.

      同步方法:使用synchronized修饰的方法,
      synchronized public    void  doWork(){
           ///TODO
      }
      同步锁是谁:
            对于非static方法,同步锁就是this.  
            对于static方法,我们使用当前方法所在类的字节码对象(Apple2.class).

      不要使用synchronized修饰run方法,修饰之后,某一个线程就执行完了所有的功能. 好比是多个线程出现串行.

      解决方案:把需要同步操作的代码定义在一个新的方法中,并且该方法使用synchronized修饰,再在run方法中调用该新的方法即可.

       

    5. 案例:懒汉式的线程安全问题,高并发时,可能创建多个实例

    6. 双重检查加锁:尽量减小synchronized的作用域,损耗性能
      所谓“双重检查加锁”机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。

      “双重检查加锁”机制:使用volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。
      提示:由于volatile关键字可能会屏蔽掉虚拟机中一些必要的代码优化,所以运行效率并不是很高。

    7. 同步锁(Lock):

       

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值