多线程对共享变量修改

题目:
启用多个线程对共享变量进行修改,每个线程输出的i必须要以连续自然数从0自增,直到i为50
效果如图
在这里插入图片描述
以前我对这个题目没有什么办法,无法控制多线程输出是以连续的自然数自增,
只能控制到i自增到50,输出的i是离散的,不连续的,
①就算加volatile修饰共享变量i也是不行
②如果仅仅加了锁又导致只有一个线程直接就自增到最大值50了,
③如果加锁的时候使用了wait方法是会导致IllegalMonitorStateException异常
④终于到第四种方法时使用了synchronized修饰方法而且用wait方法时
就能做到输出连续自然数自增i了
代码如下:

package codes;
import static java.lang.System.out;
public class ShareITest implements Runnable
{
	public static void main(String[] args) throws Exception
	{
		ShareITest sit = new ShareITest();
		for(int i = 0 ; i < 100 ; i++)
		{
			if( i == 20 )//当i自增到20时就启动多线程
			{
				new Thread(sit , "Thread-1").start();
				new Thread(sit , "Thread-2").start();
			}
		}
	}
	static  int i = 1 ;
	public synchronized void run() // synchronized关键字声明为同步方法
	{	
		try 
		{
			for( ; i <= 50 ; i++)
			{
				out.println(Thread.currentThread().getName() + "-->" + i);
				wait(20);//这里使用wait方法来让其他线程去修改共享变量
			}
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

注意这里i起始时两个线程都会读取到1,所以第一个i一定是相同的,但是i大于1之后就是连续自增了

猜你喜欢

转载自blog.csdn.net/weixin_46028606/article/details/104984718