java 多线程(4) 线程同步

/* 一,线程安全
 * 1.如本例代码所示
 * {
  * 假如线程demo1在num=1时进入到if(num>0)的判断中然后此时有切换到线程demo2此时线程demo2也是满足条件的,也就是说num
  * 在一定概率下是有可能小于0的
 * }
 * 2,线程安全问题产生的原因
 * (1)多个线程操作共享数据
 * (2).操作共享数据的线程代码有多条
  * 当一个线程在执行共享数据的过程中,其他线程也对共享数据进行了运算就会导致线程安全问题的产生
 * 3.当有两个进程并发修改同一个文件时就有可能造成异常
 * 4.

 class Anquan implements Runnable
	{
		private static int num = 100;
		Object obj=new Object();
		public void run()
		{
			while(true) {
				if(num>0) {//如果当num==1时,从一个此类线程对象切换到另一个此类现线程对象,则就会发生安全问题
				 	System.out.println(Thread.currentThread().getName()+"........."+num--);
				}
		    }
	   }
	}

    public class 线程安全 {	
	public static void main(String []args) {
		Anquan a=new Anquan();
		Thread demo1=new Thread(a);
		Thread demo2=new Thread(a);
		demo1.start();
		demo2.start();
	}
   }

*/

/*二,同步代码块
 * 1.格式:
 * synchronized(obj)
 * {
 *         //同步代码块内容
 * }//obj为同步监视器
 * 2.同步监视器的目的:阻止两个线程对同一个共享资源进行并发访问,通常使用可能被并发访问的共享资源充当同步监视器

 class Anquan implements Runnable
	{
		private static int num = 100;
		Object obj=new Object();
		public void run()
		{
			while(true) {
		    synchronized(obj) {
		   //将此处可能发生线程安全问题的地方设为同步代码块
				if(num>0) {
				 	System.out.println(Thread.currentThread().getName()+"........."+num--);
				}
		    }
			}
		}
	}
    public class 线程安全 {	
	public static void main(String []args) {
		Anquan a=new Anquan();
		Thread demo1=new Thread(a);
		Thread demo2=new Thread(a);
		demo1.start();
		demo2.start();
	}
   }

*/

/*
 * 三,同步方法
 * 1.同步方法就是使用synchronized修饰的某个方法
 * 2.对于synchronized修饰的实例方法而言,无须显示指定同步监视器,同步方法的同步监视器就是this,也就是调用该方法的对象
 * 3.线程安全的类的特征:
 * (1)该类的对象可以被多个线程安全地访问,
 * (2)每个线程调用该对象的任意方法之后都能得到正确的结果
 * (3)每个线程调用该对象的任意方法之后该对象依然保持合理状态    

 class Demo implements Runnable
{

	private static int num=100;
	public synchronized void add() {
		if(num>0)
		{
			System.out.println(Thread.currentThread().getName()+"........."+num--);
		}
	}
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			add();
		}
	}
    
}
public class 线程同步 
{
	public static void main(String[] args) {
		Demo demo1=new Demo();
		Demo demo2=new Demo();
		Thread demoThread1=new Thread(demo1);
		Thread demoThread2=new Thread(demo2);
		demoThread1.start();
		demoThread2.start();
		System.out.println("aaaaaa");
	}
}

*/

/*四,死锁
 * 1.所有的线程处于阻塞状态,无法继续进行
 * 2.

package 多线程;
class Mylock
{
	public static final Object locka=new Object();
	public static final Object lockb=new Object();
}
class Text implements Runnable
{
	private boolean flag;
	Text(boolean flag){this.flag=flag;}
	public void run() 
	{
		if(flag) {
			while(true) {
				synchronized(Mylock.locka) {
					System.out.println(Thread.currentThread().getName()+"......if......locka");
					synchronized(Mylock.lockb) {
						System.out.println(Thread.currentThread().getName()+"......if......lockb");
						
					}
				}
			}
		}
		else {
			while(true) {
				synchronized(Mylock.lockb) {
					System.out.println(Thread.currentThread().getName()+"......if......locka");
					synchronized(Mylock.locka) {
						System.out.println(Thread.currentThread().getName()+"......if......lockb");
						
					}
				}
			}
		}
	}
}
public class 死锁模式 {
	public static void main(String []args) {
		Text demo1=new Text(true);
		Text demo2=new Text(false);
		Thread a=new Thread(demo1);
		Thread b=new Thread(demo2);
		a.start();
		b.start();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值