• 多线程入门(四)


    一、同步方法

    即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。

    注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。


    二、JDK5中Lock锁的使用


    Lock是一个接口,那么找它的实现类使用。

      虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,
      为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock。
      
      Lock:
       void lock(): 获取锁。
       void unlock():释放锁。  
      ReentrantLock是Lock的实现类.


    如下示例,明确知道在哪加锁和释放锁

    public class SellTicket implements Runnable {
    
    	// 定义票
    	private int tickets = 100;
    
    	// 定义锁对象
    	private Lock lock = new ReentrantLock();
    
    	@Override
    	public void run() {
    		while (true) {
    			try {
    				// 加锁
    				lock.lock();
    				if (tickets > 0) {
    					try {
    						Thread.sleep(100);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					System.out.println(Thread.currentThread().getName()
    							+ "正在出售第" + (tickets--) + "张票");
    				}
    			} finally {
    				// 释放锁
    				lock.unlock();
    			}
    		}
    	}
    
    }


    三、死锁问题


    同步弊端

    效率低

    如果出现了同步嵌套,就容易产生死锁问题

    死锁问题及其代码

    是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象

    同步代码块的嵌套案例


    四、线程间通信

    1.生产者消费者模型



    等待唤醒:
       Object类中提供了三个方法:
       wait():等待
      notify():唤醒单个线程
       notifyAll():唤醒所有线程
       为什么这些方法不定义在Thread类中呢?

       这些方法的调用必须通过锁对象调用,而我们刚才使用的锁对象是任意锁对象(随便的对象)。

      所以,这些方法必须定义在Object类中。


  • 相关阅读:
    如何做好不擅长的测试任务
    [ Python入门教程 ] Python中日志记录模块logging使用实例
    [ Python入门教程 ] Python中日期时间datetime模块使用实例
    cmd命令行窗口和文件目录资源管理器快速切换
    [ Python入门教程 ] Python中JSON模块基本使用方法
    [ PyQt入门教程 ] PyQt5中多线程模块QThread使用方法
    [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法
    设计模式目录
    我的软考架构师之路:目录(共22篇)
    算法篇:目录
  • 原文地址:https://www.cnblogs.com/chz-blogs/p/9380998.html
Copyright © 2020-2023  润新知