14.1 同步函数、死锁现象


进程:一个正在运行的应用程序,负责内存空间的划分。
线程:一个进程中的代码是有线程来执行的,线程也是进程中的一个执行路径。
多线程:一个进程中有多个线程可以同时进行执行。

多线程的优点:
1、一个进程中多个线程可以同时执行。
2、提高了资源的利用率。
 
多线程的劣势:
1、降低了一个进程中多线程的执行概率。
2、增加了cpu负担。
3、出现线程安全问题。
4、出现死锁。


自定义线程的步骤:
1、自定义类,该类继承Thread类。
2、重写run方法。
3、创建Thread子类对象,调用start方法,来启动线程。


注意:千万不要直接调用run方法,调用start方法的时候线程会启动,线程一旦开启就会执行run方法中的代码,如果直接调用run方法,那么久相当于调用了一个普通方法而已。


线程安全问题的解决方案;
方式一:可以用手同步代码来解决

格式:synchronized(锁对象)
{
同步的代码块
}


同步代码块的注意事项:
1、锁对象是任意的一个对象。
2、一个线程在同步代码块中sleep了,其不会释放资源。
3、如果不存在线程安全问题时,不要使用同步代码块,因为会降低效率。

4、锁对象必须是多线程的共享对象,不然锁不住。



注意:资源设置为静态,多线程必须是同一个锁对象。


方式二:同步函数,同步函数就是使用synchronized修饰函数
格式如;public synchronized void run();


同步函数注意的事项:
1、如果是一个如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)。
2、同步函数的锁对象是固定的,不是由我们自己定义的。



死锁现象出现的根本原因:
1、存在两个或者两个以上的线程。
2、存在两个或者两个以上的共享资源。


死锁现象的解决方案:没有方案,只能尽量避免。


class test extends Thread
{
	static int tick= 40;
	test(String name)
	{
		super(name);
	}

	@Override
	public void run() {
		
		
				if("张三".equals(Thread.currentThread().getName()))
				{
					synchronized("遥控器")
					{
					System.out.println("张三拿到遥控器,准备去拿电池");
					
					synchronized("电池")
					{
						System.out.println("张三拿到了电池和遥控器,开了空调开心");
					}
					}					
				}
				
				else  if("李四".equals(Thread.currentThread().getName()))
				{
					synchronized("电池")
					{
						System.out.println("李四拿了电池,准备去拿遥控器");
						synchronized("遥控器")
						{
							System.out.println("李四拿到了遥控器和电池,开了空调开心");
						}
					}					
					
				}		
	}
}



class wu
{
 public static void main(String [] args)
 {
	test t1 = new test("张三");
	test t2 = new test("李四");
	t1.start();
	t2.start();

	
 }
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值