同步和异步
同步:起到了排队的效果,同一时刻只有一个线程使用资源,其他的需要等待,好处是安全系数高,坏处是效率慢 异步,线程们互相抢占资源,好处是提高了效率,坏处是容易出现安全隐患
如何判断程序中有没有可能出现线程安全问题,主要以下三个条件 1 在多线程程序中 +2 有共享数据+ 3 多条语句操作共享数据
出现问题时,容易出现超出和重复现象
synchronized (MyThread.class) {
if (ticket>0){
try {
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);
for(int i=0;i<5;i++){
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();
int a()default 0;
String value();
String value()default "";
String value(); int a() ;
}
设计模式
1.概念是一些前人总结出来的编程套路,设计模式一共32种 2.单例设计模式:就是确保本类中的实例只有一个
3:实现思路 1,创建自定义类,并将无参构造方法私有化,目的是防止外界调用 2.在本类中通过构造方法去创建对象,并将其私有化,防止外界调用 3.创建本类的功能方法,目的是向外部返回本类唯一的一个对象’ 方法需要设置成静态,因为静态可以直接通过类名调用,同时需要将对象也设置成静态,因为对象的地址值需要被方法返回,所以 对象也需要设置成静态
public class Random5Demo2 {
public static void main(String[] args) {
Animal a1 = Animal.getAnimal();
Animal a2 = Animal.getAnimal();
System.out.println(a1.equals(a2));
}
}
class Animal{
private Animal(){
}
private static Animal animal= new Animal();
public static Animal getAnimal(){
return animal;
}
}
|