同步函数死锁现象
多线程:一个进程中有多个线程可以同时执行任务
多线程的好处:
1、解决一个进程中可以同时执行多个任务的问题。
2、提高了资源利用率
多线程的弊端:
1、增加了CPU的负担
2、降低了一个进程中线程的执行概率
3、出现了线程安全问题
4、会引发死锁现象
自定义线程的实现方式:
方式一:
1、自定义一个类继承Thread类。
2、重写Thread类的run方法,把自定义线程的任务代码写在run方法上
3、创建Thread的子类对象,并且调用start方法启动一个线程
线程安全问题出现的根本原因:
1、存在两个或两个以上的线程共享同一资源
2、多谢操作共享资源的代码有多行
同步函数:使用synchronized修饰的函数
同步函数要注意的事项:
1、如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)。
2、同步函数的锁对象是固定的,不能由你来指定。
package com.longteng.lesson2; public class SaleTicket extends Thread { static int count = 5000; public SaleTicket(String name){ super(name); } @Override public synchronized void run(){ while(true){ if (count > 0) { count = count -1000; System.out.println (Thread.currentThread ().getName () + "取走了1000块,还剩余" + count + "元"); } else { System.out.println ("取完了。。"); break; } } } public static void main(String[] args) { SaleTicket thread1 = new SaleTicket ("老公"); SaleTicket thread2 = new SaleTicket ("老婆"); thread1.start (); thread2.start (); } }
老婆取走了1000块,还剩余3000元
老婆取走了1000块,还剩余2000元
老婆取走了1000块,还剩余1000元
老婆取走了1000块,还剩余0元
取完了。。
老公取走了1000块,还剩余4000元
取完了。。
推荐使用同步代码块
1、同步代码块的锁由我们随意指定,方便控制,同步函数的锁对象是固定的
2、同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码都被同步
java中的同步机制解决了线程安全的问题,但同时也引发了死锁现象