• java多线程基础2


    1.线程加锁

      多个线程需要共享对同一个数据的访问。如果每个线程都会调用一个修改共享数据状态的方法,那么,这些线程将会互相影响对方的运行。在Java语言中,引入对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问对象。就像上一篇博客讲到用多线程模拟售票时,会出现两个车站卖同一张票的时候,这种情况就需要我们在对卖票时加锁,有一个线程访问这段代码时,别的线程就不能访问,保证不会发生两个线程同时访问同一个数据的情况。java的加锁方式有以下两种:

      ①synchronized同步代码块

      当某个对象用修饰时,表明该对象在任一时刻只能由一个线程访问。

      语法:

    synchronized(this){
      //需要同步的代码;  
    }

      示例:

    public void run() {
        while(sign) {
            synchronized (this) {
                if(ticket >= 1) {
                    System.out.println(Thread.currentThread().getName() + ":" + this.ticket--);
                }else{
              sign = false;
           }
    
            }
        }
    } 

      或者

    public synchronized void sale(){
       ticket--; 
    }

      ②显式加锁:JDK5.0后提出,注意,我们加的锁的粒度越细越好。

      语法: 

    private static final Lock lock = new ReentrantLock();  //创建Lock实例 
    lock.lock();  //获取锁
    //需要同步的代码
    lock.unlock();  //释放锁

      实例:

    public void run() {
        while(sign) {
            lock.lock();
            if(ticket >= 1) {
                System.out.println(Thread.currentThread().getName() + ":" + this.ticket--);
            }else {
                sign = false;
            }
        lock.unlock();
        }
    }

     

    2.线程让步 

    线程让步为暂停当前正在执行的线程对象,把执行机会让给别的线程。

    语法:

    Thread.yield() 

    代码:

    package com.cmq.test;
    /**
    *@author chenmeiqi
    *@version 2020年2月
    */
    public class ThreadYield {
        public static void main(String[] args) {
            System.out.println("主线程:" + Thread.currentThread().getName());
            Thread thread1 = new Thread(new MyThread2());
            thread1.start();
            Thread thread2 = new Thread(new MyThread2());
            thread2.start();
        } 
    } 
    
    class MyThread2 implements Runnable{
        
        public void run() {
            //线程体
            for(int i = 0;i<100;i++){
                System.out.println(Thread.currentThread().getName()+ ":" + i);
                if(i % 10 == 0){
                    Thread.yield(); //线程让步
                }
            }
        }
    }    

    运行结果

     

  • 相关阅读:
    springcloud2.0 添加配置中心遇到的坑
    redis 字符串和集合操作
    Linux
    流畅的python 符合python风格的对象
    流畅的python 对象引用 可变性和垃圾回收
    流畅的python 闭包
    流畅的python 使用一等函数实现设计模式
    互联网协议入门
    流畅的python 字典和集合
    流畅的python python数据模型
  • 原文地址:https://www.cnblogs.com/qilin20/p/12313664.html
Copyright © 2020-2023  润新知