zoukankan      html  css  js  c++  java
  • java多线程相关知识点---持续更新...

    1、线程和进程的区别:

      线程是资源分配的最小单位;进程是程序执行的最小单位。打开QQ就是开了一个进程,QQ里的各项功能就是一个个线程去执行;

    2、Thread类的常见方法:

      Thread(Runnable target) :实例化时传入Runnable对象

      start();//启动线程

      getId();//获得线程ID

      getName();//获得线程名字

      getPriority();//获得优先权

      isAlive();//判断线程是否活动

      isDaemon();//判断是否守护线程

      getState();//获得线程状态

      sleep(long mill);//休眠线程

      join();//等待线程结束

      yield();//放弃cpu使用权利

      interrupt();//中断线程

      currentThread();//获得正在执行的线程对象

    3、可以用什么手段来解决线程安全性问题:

      1、synchronized锁

      2、使用原子类操作:Atomic

      3、使用juc下的:concrruntHashMap

      4、Lock锁

    4、Synchronized和Lock锁的区别:

      1、用法不同:

      synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象

      lock:一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。

      2、性能不同:

      在资源竞争不是很激励的情况下,synchronized的性能要优于ReentrantLock,带在资源紧张很激烈的情况下,synchronized的性能会下降的很快,而ReentrantLock的性能基本保持不变。

      3、抄一下网上总结的:

      Synchronized是关键字,内置语言实现,Lock是接口。

      Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。

      Lock是可以中断锁,Synchronized是非中断锁,必须等待线程执行完成释放锁。

      Lock可以使用读锁提高多线程读效率。

      Lock:底层是CAS乐观锁,依赖AbstractQueuedSynchronizer类,把所有的请求线程构成一个CLH队列。而对该队列的操作均通过Lock-Free(CAS)操作

      Lock用代码玩玩(例子用的网上找的,自己敲一下看看执行情况):

    public class LockTest {

    public static void main(String[] args) {
    Ticket ticket = new Ticket();
    Thread firstThread = new Thread(ticket, "售票窗口A");
    Thread secondThread = new Thread(ticket, "售票窗口B");
    firstThread.setPriority(Thread.MIN_PRIORITY); //设置优先级
    secondThread.setPriority(Thread.NORM_PRIORITY);

    secondThread.start();
    firstThread.start();
    }

    }
    class Ticket implements Runnable{

    private int ticketNumber = 100;

    private Lock lock = new ReentrantLock();

    @Override
    public void run() {
    while (true){
    lock.lock();
    try {
    if (ticketNumber > 0) {
    try {
    Thread.sleep(200);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "售票一张,现在还剩票数为:" + --ticketNumber);
    }
    } finally {
    lock.unlock();
    }
    }
    }
    }

    4、什么是AQS、ReentrantLock和ReentrantReadWriteLock锁:

      憋不住了。休息会,搞这些概念真的无聊,去敲代码实现以下。

  • 相关阅读:
    NetBeans 时事通讯(刊号 # 95 Mar 19, 2010)
    现在才知道TR1的错误在VC9的SP1中解决
    TinyXml快速入门(三)
    Install python 2.6 in CentOS Stack Overflow
    rpm forge install on centos 5
    Linux tee ysdaniel的专栏 博客频道 CSDN.NET
    python26 gramma
    一个简单的基于编辑距离的英文单词查错(Python) Muilpin.Miao的日志 网易博客
    磁盘目录占用空间计算排序工具 ncdu
    PyCon China 2012
  • 原文地址:https://www.cnblogs.com/tengri-fighting/p/12721163.html
Copyright © 2011-2022 走看看