11 多线程

本文通过一个具体的线程同步案例,详细介绍了如何使用Java的synchronized关键字、wait、notify及notifyAll方法来实现线程间的同步与互斥,避免了竞态条件的发生,并探讨了这些方法之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:两个线程,其中一个线程完成对某个对象的int值++操作,另一个线程对该对象的int类型--操作,同时要保证该对象的值不会小于0,不会大于1,该值初始化值为0.

结果为 01010101010101010101……

package com.test;

public class ThreadTest {

	private int number = 0;

	public synchronized void jia() throws InterruptedException {

		if (number != 0) {
			wait();
		}
		number++;
		System.out.println("jia:"+number);
		notify();

	}

	public synchronized void jian() throws InterruptedException {
		if (number == 0) {
			wait();
		}
		number--;
		System.out.println("jian:"+number);
		notify();
	}

	public static void main(String[] args) {

		ThreadTest tt = new ThreadTest();
		
		Producer p = new Producer(tt);
		Consumer c = new Consumer(tt);
		
		p.start();
		c.start();
		
	}

}

class Producer extends Thread{
	
	ThreadTest tt;
	
	public Producer(ThreadTest tt) {
		this.tt=tt;
	}
	
	@Override
	public void run() {
		while(true){
			try {
				tt.jia();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}


class Consumer extends Thread{
	
	ThreadTest tt;
	
	public Consumer(ThreadTest tt) {
		this.tt=tt;
	}
	
	@Override
	public void run() {
		while(true){
			try {
				tt.jian();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}
输出结果为

jian:0

jia:1

jian:0

jia:1

jian:0

jia:1

jian:0

jia:1

jian:0


加启动两个线程,减启动两个线程?

	private int number = 0;

	public synchronized void jia() throws InterruptedException {

		while (number != 0) {
			wait();
		}
		number++;
		System.out.println(Thread.currentThread().getName()+ "  jia:"+number);
		notify();;

	}

	public synchronized void jian() throws InterruptedException {
		while (number == 0) {
			wait();
		}
		number--;
		System.out.println(Thread.currentThread().getName()+ "  jian:"+number);
		notify();
	}

改成while的话有可能会造成死锁,解决办法为把notify改为notifyAll方法调用。


关于wait,notify,notifyAll以及sleep方法的关系(重点)

(1,如果一个线程调用了某个对象的wait方法,那么该线程首先必须要拥有该对象的锁。(一个线程调用了某个对象的wait方法,那么该wait必须在synchronized中)

(2,如果一个线程调用了某个对象的wait方法,那么该线程就会释放该对象的锁。

(3,在java对象中,有两种池(锁池,等待池)

(4,如果一个线程调用了某个对象的wait方法,那么该线程进入该对象的等待池中(释放锁)如果未来某一时刻,另外一个线程调用了该对象的notify或者notifyAll方法,那么在该等待池中的等待的线程就会进入该对象的锁池中,去等待该对象的锁,如果或得锁成功后,那么该线程将继续沿着wait方法之后的路径去执行。

(5,sleep 睡眠,不释放锁






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值