并发(多线程)编程笔记汇总(知识点全覆盖)

1.守护线程:在不存在非守护线程时则守护线程自动销毁,典型的守护线程就是垃圾回收线程。
2.Thread.yield()方法理解:放弃当前的CPU资源,让其他线程去占用CPU执行时间,其它线程包括自身,即让其它就绪态的线程抢占CPU资源。
3.thread.suspend()和thread.resume()方法分别为挂起和恢复线程执行,该方法为过时废弃的方法。急易造成公共的同步对象独占,使其它线程无法访问公共同步对象。也容易出现因为线程的暂停导致数据不同步的情况。
4.停止线程的方法: a.使用退出标识,是线程正常退出,额就是当run方法完成后线程终止。 b.使用stop方法强行终止线程,是暴力停止线程,该方法过时停用了,stop()释放锁会造成数据不一致。
c.使用interrupted方法终端线程
this.interrupted():测试当前线程是否已经终止状态,执行后会将终止状态标识置为false。
this.isInterrupted():测试线程对象是否已经是终止状态,执行后不会清除状态标识。
5.同步功能的实现 a.使用synchronized
synchronized锁可重入:在synchronized方法/块内部调用内部本类其他synchronized方法和块时,是永远可以得到锁的。
synchronized(this):当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的非synchronized(this)同步代码块;但是会阻塞其他线程访问其他所有
synchronized(this)同步代码块。
synchronized(this) 锁的是类对象,this也可以替换成其他非类对象。
synchronized(class)和 synchronized 加在静态方法时效果都是锁定整个CLASS.
6.区别synchronized关键字和violatile关键字 synchronized 保证代码块的原子性,会阻塞线程。violatile保证不同线程能取到最新的变量的值。最大缺点是不具备原子性。
7.wait、notify、notifyAll java中每个object对象都实现了上述方法。上述方法必须在synchronized 同步代码块中调用,否则会有异常。
wait:可以使调用该方法的线程释放共享资源,从运行态进入等待队列,直到被再次唤醒。执行完该方法就会释放锁;wait状态的线程,如果调用了线程对象的interrupted方法会出现异常。
wait(long)等待某一时间则自动唤醒线程,对比sleep(long),wait方法执行后释放当前线程锁,而sleep(long)不会释放锁。
notify:随机唤醒等待队列中一个线程,并且要等到同步代码块的所有代码都执行完后才回释放锁。
notifyAll:唤醒等待队列中所有的线程。
8.join的左右是使所属线程进行X正常执行run()方法中的任务,从而使主线程进入无限期的等待,直到X线程执行完销毁后再继续执行主线程的代码。
join类似于同步的运行效果,与synchronized的区别是:join的内部使用wait方法进行等待,而synchronized使用的是“对象监控”原理作为同步实现。
join(long)设置等待时间。
9.ThreadLocal:主要解决每个线程绑定自己的值,可以将它比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。直白点理解:就是每个线程都可以往ThreadLocal里面设置值,它底层是一个map结构,key为你当前的处理线程、value为你设置的值的对象。尽管你多次往里面put值,但是最终相同处理线程ID,只会存在一条记录。
10.Lock的使用 Reentrantlock与Condition的结合使用,也能实现关键字synchronized 与wait()、notify()、notifyAll()实现的等待/通知模式。后者相当于整个lock对象中只有一个单一的Condition对象,所有的线程都注册在一个对象上,只能随机通知所有的waiting状态的线程,没有选择权,会出现相当大的效率问题。而前者可以在lock对象上创建多个Condition实例,线程可以注册在指定的Condition实例中,从而有选择的进行线程通知,在调度上更加灵活。
11.公平锁与非公平锁 锁lock分为公平锁与非公平锁,公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配,即先来先得的FIFO先进先出队列。非公平锁是一种获取锁的抢占机制,是随机获取锁,可能会造成某些线程一直拿不到锁,结果就是不公平的。
12.ReentrantReadWriteLock锁。 读写锁表示读和写有两个锁,一个读操作相关的锁为共享锁,另外一个与写操作相关的锁为排他锁,读锁与写锁互斥,写锁与写锁互斥。在没有线程Thread进行写操作时,进行读操作的多个线程都可以获取读锁。而进行写入操作的线程只有在获取写锁后才能进行写入操作。即多个线程可以同时进行读取操作。但是同一时刻值允许一个线程进行写入操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值