首页 > 编程语言 > 详细

java多线程基础2

时间:2020-02-15 23:02:54      阅读:48      评论:0      收藏:0      [点我收藏+]

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(); //线程让步
            }
        }
    }
}    

 

运行结果

技术分享图片

 

 技术分享图片

 

java多线程基础2

原文:https://www.cnblogs.com/qilin20/p/12313664.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!