同步和异步
同步:起到了排队的效果,同一时刻只有一个线程使用资源,其他的需要等待,好处是安全系数高,坏处是效率慢
异步,线程们互相抢占资源,好处是提高了效率,坏处是容易出现安全隐患
如何判断程序中有没有可能出现线程安全问题,主要以下三个条件
1 在多线程程序中 +2 有共享数据+ 3 多条语句操作共享数据
出现问题时,容易出现超出和重复现象
//方案一 解决方案 通过 ,synchronized(同步锁对象){容易出现问题的代码} 和if () 来解决
synchronized (MyThread.class) {
if (ticket>0){
try {
//创建 sleep 增加代码出错概率 出现了重卖 和超卖现象
MyThread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "=" + ticket--);
}
if (ticket <= 0) break;
}
//方案二重复和超出的解决方案
while(true) {
synchronized (MyThread.class){
//多个线程对象需要使用同一把锁 才会生效
if (tickes>0) {
try {
MyThread.sleep(10); //出错的概率增加
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "=" + tickes--);
}
//设置一个出口
if (tickes <= 0) break;
}
}
同步代码块
synchronized同步关键字可以用来修饰代码块,称为同步代码块,
格式 ,synchronized(同步锁对象){容易出现问题的代码}
同步代码块在同一时刻,同一资源只会被一个线程对象独享
同步锁
相当于将容易出问题的代码加了一把锁,包裹了所有会数据安全的代码
加锁之后,范围内的代码就有了排队的效果,但是注意!!!多个线程只能有一把锁’
不能出现多把锁,否则会失去意义
线程池
Executors 是用来辅助创建线程池的工具类
创建出来的线程池对象 ExecutorService:这个池子用来新建/启动/存储/销毁线程
常用方法是
Executors.newFixedThreadPool(5); //最多5个线程 不一定创建5个
for(int i=0;i<5;i++){
/**execute是让线程池中的线程来执行任务,每次调用这个方法,都会让一个线程加入到就绪队列中,执行看os*/
pool.execute(业务类对象)
}
注解
分为1 JDK自带的注解
@override 已经学过
2 元注解 用来注解自定义的注解 有5个
要求掌握的是
@Target ({ElementType.xxx , ElementType.x1x1x1 , ElementType.yyy }) // 可以定义注解的使用范围
@Retention(RentionPolicy.RUNTIME/SOURCE/CLASS) //可以定义注解的生存范围 只能三选以
3自定义注解
格式 @interface +注解名
需要用上面的两个元注解来注解
@Retention(RetentionPolicy.RUNTIME)//定义注释使用的
//定义元注释 用来给自定义注释注释可以注释的内容
@Target({
ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})
//自定义一个注释
@interface Pig{
int a(); //对应 @Pig(a=10)
int a()default 0; //对应 @Pig() 设置默认值
String value(); //直接输出值 可以简写 @Pig()
String value()default ""; //设置默认值 可以空值 @Pig()
String value(); int a() ;//同时输出的情况下,两者都不能简写 @Pig(a=10,value="哈哈")//
}
设计模式
1.概念是一些前人总结出来的编程套路,设计模式一共32种
2.单例设计模式:就是确保本类中的实例只有一个
3:实现思路
1,创建自定义类,并将无参构造方法私有化,目的是防止外界调用
2.在本类中通过构造方法去创建对象,并将其私有化,防止外界调用
3.创建本类的功能方法,目的是向外部返回本类唯一的一个对象’
方法需要设置成静态,因为静态可以直接通过类名调用,同时需要将对象也设置成静态,因为对象的地址值需要被方法返回,所以
对象也需要设置成静态
public class Random5Demo2 {
public static void main(String[] args) {
Animal a1 = Animal.getAnimal();//5返回值交给Animal类的 a1保存
Animal a2 = Animal.getAnimal();
System.out.println(a1.equals(a2));//equals在Object中默认是比较地址值,true.
}
}
//1定义一个自定义类
class Animal{
//2为了使外界不能创建此类对象,将无参构造私有化
private Animal(){
}
//3在本类中可以创建此类对象 ,
private static Animal animal= new Animal();
//4创造一个公共方法,返回此类的对象 为了能让外界不通过对象来调用此方法,我们创建静态
//因为静态资源 可以直接通过类名调用 ,因为返回值是普通类型,而只有静态资源才能调用静态资源
public static Animal getAnimal(){
return animal;
}
}
文章评论