如果不能满足,锁定的是对象

2019-09-30 15:31栏目:美高梅开户送58元官网
TAG:

  • 欢迎关注我的公众号美高梅网上游戏 1公众号
1、你常用的jvm监控工具或者命令有哪些
  • GC日志 PrintGCDetails 每次GC记录日志
  • jstat -gcutil pid 5s 10//间隔5s,打印10次
![](https://upload-images.jianshu.io/upload_images/4714843-ce0f73baecb07d28.png)

Paste_Image.png



S0 — Heap上的 Survivor space 0 区已使用空间的百分比  
S1 — Heap上的 Survivor space 1 区已使用空间的百分比  
E — Heap上的 Eden space 区已使用空间的百分比  
O — Heap上的 Old space 区已使用空间的百分比  
M — Metaspace 区已使用空间的百分比  
YGC — 从应用程序启动到采样时发生 Young GC 的次数  
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)  
FGC — 从应用程序启动到采样时发生 Full GC 的次数  
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)  
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
  • jstack pid:结合top看看是不是cpu过高,导致死锁

1、synchronized

1、使用Glide裁剪圆形图片、圆角图片和处理模糊图片

2、java8的lambda表达式了解过吗?

java8之前:

new Thread(new Runnable(){
     public void run() {
         System.out.println(1123);
     }
}).start();

java8:

    new Thread(() -> System.out.println(123)).start();

还有其他的好多东西,下次找个时间专门研究一下这个。

静态:锁定的是类

美高梅网上游戏 2Paste_Image.png

3、A,B两个线程同时启动,但让A结束后B在结束,如何实现。

用join关键字。t.join()方法阻塞调用此方法的线程(calling thread),直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程。例如:

public class Test implements Runnable{

private String name;

public Test(String name) {
    this.name = name;
}

@Override
public void run() {
    try {
        Thread.sleep(1000);
    System.out.println(new Date()+"  "+name);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new Test("zhangsan"));
    Thread thread1 = new Thread(new Test("lijia"));
    thread.start();
    thread1.start();
    thread.join();
    thread1.join();
    System.out.println("qqqqqqqqqqqq");
}
}

美高梅网上游戏 3

运行结果

如果把join去掉:

美高梅网上游戏 4

Paste_Image.png

非静态:锁定的是对象

2、对本地图片处理的三种效果

4、java中什么是锁

我认为面试官一般问这种问题都是想问你synchronized。主要是问完这个也会顺带着问Lock。锁里面还有一些概念公平锁、非公平锁、自旋锁、可重入锁、偏向锁、轻量级锁、重量级锁、读写锁、互斥锁等。
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  • 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;

  • 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;

  • 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;

  • 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

      public class Test2 {
      public static void main(String[] args) {
      SyncThread syncThread = new SyncThread();
      Thread thread1 = new Thread(syncThread, "SyncThread1");
      Thread thread2 = new Thread(syncThread, "SyncThread2");
      thread1.start();
      thread2.start();
    
      }
      }
     class SyncThread implements Runnable {
       private int count;
       public SyncThread() {
       count = 0;
      }
     public  void run() {
      //        synchronized(this) {
           for (int i = 0; i < 5; i++) {
              try {
                  System.out.println(Thread.currentThread().getName() + ":" + (count++));
                  Thread.sleep(100);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
     //        }
    }
       public int getCount() {
        return count;
       }
    }
    

运行结果为

美高梅网上游戏 5

加上synchronized之后

美高梅网上游戏 6

再没有加锁之前,两个线程相互调用cpu,加锁之后,SyncThread1线程执行完才到SyncThread2,而且保证了正确性。

有一点要注意:对于synchronized方法或者synchronized代码块,当出现异常时,美高梅开户送58元官网 ,JVM会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象。

美高梅网上游戏 7Paste_Image.png美高梅网上游戏 8

那么再说说volatile吧

还是用上面的例子说明,其他都不动

 private volatile int count;//在count这加入volatile

运行结果

美高梅网上游戏 9

图片.png

美高梅网上游戏 10

图片.png

用volatile只能保证可见性,但是不保证原子性。如上图,结果就是不正确的。
volatile也能禁止重排序

美高梅网上游戏 11

那么volatile怎么保证可见性和禁止重排序
引入深入理解java虚拟机中一段话: 观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令
lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
2)它会强制将对缓存的修改操作立即写入主存;
3)如果是写操作,它会导致其他CPU中对应的缓存行无效。
使用volatile必须具备以下2个条件:
1)对变量的写操作不依赖于当前值
2)该变量没有包含在具有其他变量的不变式中
也会说道Lock和AQS,请看
http://www.jianshu.com/p/d333d5177498。
也许会问JUC下的一些其他类,这里不说了。

2、java.util.concurrent.locks

1、肯定不能光自己爽,你要想到用到地方的可能性。2、同时,代码要一目十行,一看就明白这个方法是做什么,如果别人想扩展,要很容易。3、基于Glide图片加载框架,使用起来要务必方便,代码不臃肿,能够满足各种姿势,各种要求。如果不能满足,自定义起来需务必方便。

1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;

创建依赖

1、这个不需多提,不要什么都放在app目录下,一定要用依赖的形式

美高梅网上游戏 12美高梅网上游戏 ,Paste_Image.png2、加入依赖compile 'com.github.bumptech.glide:glide:3.6.13、包名结构美高梅网上游戏 13Paste_Image.png

a、关键接口定义:需要根据业务逻辑不断的修改,明确几点即可,哪里需要用到图片加载?Fragment中使用,Activity中使用,加载需要监听的地方,需要给与加载中或者是加载失败的图片过度,需要加载本地图片,需要对图片进行处理(圆形,倒角,模糊图等效果),反之即可定义此接口,方便以后扩展更加复杂的图片处理。

public interface IImageLoaderClient { public void init(Context context); public void destroy(Context context); public File getCacheDir(Context context); public void clearMemoryCache(Context context); public void clearDiskCache(Context context); public Bitmap getBitmapFromCache(Context context, String url); public void getBitmapFromCache(Context context, String url, IGetBitmapListener listener); public void displayImage(Context context, int resId, ImageView imageView); public void displayImage(Context context, String url, ImageView imageView); public void displayImage(Context context, String url, ImageView imageView, boolean isCache); public void displayImage(Fragment fragment, String url, ImageView imageView); public void displayImage(Context context, String url, ImageView imageView, int defRes); public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes); public void displayImage(Context context, String url, ImageView imageView, int defRes, IBitmapTransformation... transformations); public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, IBitmapTransformation... transformations); public void displayImage(Context context, String url, ImageView imageView, int defRes, ImageSize size); public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, ImageSize size); public void displayImage(Context context, String url, ImageView imageView, int defRes, boolean cacheInMemory); public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, boolean cacheInMemory); public void displayImage(Context context, String url, ImageView imageView, IImageLoaderListener listener); public void displayImage(Fragment fragment, String url, ImageView imageView, IImageLoaderListener listener); public void displayImage(Context context, String url, ImageView imageView, int defRes, IImageLoaderListener listener); public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, IImageLoaderListener listener); public void displayCircleImage(Context context, String url, ImageView imageView, int defRes); public void displayCircleImage(Fragment fragment, String url, ImageView imageView, int defRes); public void displayRoundImage(Context context, String url, ImageView imageView, int defRes, int radius); public void displayRoundImage(Fragment fragment, String url, ImageView imageView, int defRes, int radius); public void displayBlurImage(Context context, String url, int blurRadius, IGetDrawableListener listener); public void displayBlurImage(Context context, String url, ImageView imageView, int defRes, int blurRadius); public void displayBlurImage(Context context, int resId, ImageView imageView, int blurRadius); public void displayBlurImage(Fragment fragment, String url, ImageView imageView, int defRes, int blurRadius); public void displayImageInResource(Context context, int resId, ImageView imageView); public void displayImageInResource(Fragment fragment, int resId, ImageView imageView); public void displayImageInResource(Context context, int resId, ImageView imageView, IBitmapTransformation... transformations); public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, IBitmapTransformation... transformations); public void displayImageInResource(Context context, int resId, ImageView imageView, int defRes); public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, int defRes); public void displayImageInResource(Context context, int resId, ImageView imageView, int defRes, IBitmapTransformation... transformations); public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, int defRes, IBitmapTransformation... transformations);}

b、需要根据业务定义自定义的接口回调,以下三个接口回调的用处是为了获取缓存中的bitmap、获取加载完成后的drawable,获取下载失败成功的回调

/** * Created by shiming on 2016/10/26. */public interface IGetBitmapListener { void onBitmap(Bitmap bitmap);}/** * Created by shiming on 2016/10/26. * 设置此皆苦是为了业务需要,一般不需要关心网络请求回来的drawable,但是业务需要切换的地方的话,需要拿到网络请求回来的drawable */public interface IGetDrawableListener { void onDrawable(Drawable drawable);}/** * Created by shiming on 2016/10/26. * 监听图片下载进度 */public interface IImageLoaderListener { //监听图片下载错误 void onLoadingFailed(String url, ImageView target, Exception exception); //监听图片加载成功 void onLoadingComplete(String url, ImageView target);}

c、主要的实现类

/** * Created by shiming on 2016/10/26. * des: * with(Context context). 使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。 with(Activity activity).使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。 with(FragmentActivity activity).Glide的请求会受到FragmentActivity生命周期控制。 with(android.app.Fragment fragment).Glide的请求会受到Fragment 生命周期控制。 with(android.support.v4.app.Fragment fragment).Glide的请求会受到Fragment生命周期控制。 */public class GlideImageLoaderClient implements IImageLoaderClient { @Override public void init(Context context) { } @Override public void destroy(Context context) { clearMemoryCache; } @Override public File getCacheDir(Context context) { return Glide.getPhotoCacheDir; } @Override public void clearMemoryCache(Context context) { Glide.get.clearMemory(); } @Override public void clearDiskCache(Context context) { Glide.get.clearDiskCache(); } @Override public Bitmap getBitmapFromCache(Context context, String url) { throw new UnsupportedOperationException("glide 不支持同步 获取缓存中 bitmap"); } @Override public void getBitmapFromCache(Context context, String url, final IGetBitmapListener listener) { Glide.with.load.asBitmap().into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { if (listener != null) { listener.onBitmap; } } }); } /** * * @param context 上下文 * @param resId id * @param imageView into */ @Override public void displayImage(Context context, int resId, ImageView imageView) { //设置缓存策略缓存原始数据 Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView); } /** * * @param context * @param url url * @param imageView in */ @Override public void displayImage(Context context, String url, ImageView imageView) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView); } /** * * @param context * @param url * @param imageView * @param isCache 是否是缓存 如果是:缓存策略缓存原始数据 不是的话 :缓存策略DiskCacheStrategy.NONE:什么都不缓存 */ @Override public void displayImage(Context context, String url, ImageView imageView, boolean isCache) { Glide.with.load.skipMemoryCache.diskCacheStrategy(isCache ? DiskCacheStrategy.SOURCE : DiskCacheStrategy.NONE).into(imageView); } /** * * @param fragment 绑定生命周期 * @param url * @param imageView */ @Override public void displayImage(Fragment fragment, String url, ImageView imageView) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView); } /** * 使用.placeholder()方法在某些情况下会导致图片显示的时候出现图片变形的情况 * 这是因为Glide默认开启的crossFade动画导致的TransitionDrawable绘制异常 * @param context * @param url * @param imageView * @param defRes */ @Override public void displayImage(Context context, String url, ImageView imageView, int defRes) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).crossFade().placeholder.error.into(imageView); } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.into(imageView); } /** * * @param context * @param url * @param imageView * @param defRes * @param transformations bitmapTransform 方法设置图片转换 */ @Override public void displayImage(Context context, String url, ImageView imageView, int defRes, final IBitmapTransformation... transformations) { int size = transformations.length; //由于这里bitmapTransform接受的为com.bumptech.glide.load.resource.bitmap.BitmapTransformation子类 //所以需要我们传入构造函数去 GlideTransform[] glideTransforms = new GlideTransform[size]; for (int i = 0; i < size; i++) { glideTransforms[i] = new GlideTransform(transformations[i].getContext(), transformations[i]); } Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.bitmapTransform(glideTransforms).into(imageView); } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, IBitmapTransformation... transformations) { int size = transformations.length; GlideTransform[] glideTransforms = new GlideTransform[size]; for (int i = 0; i < size; i++) { glideTransforms[i] = new GlideTransform(transformations[i].getContext(), transformations[i]); } Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.bitmapTransform(glideTransforms).into(imageView); } /** * * @param context * @param url * @param imageView * @param defRes placeholder(int resourceId). 设置资源加载过程中的占位Drawable error(int resourceId).设置load失败时显示的Drawable * @param size override(int width, int height). 重新设置Target的宽高值 */ @Override public void displayImage(Context context, String url, ImageView imageView, int defRes, ImageSize size) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.override(size.getWidth(), size.getHeight.into(imageView); } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, ImageSize size) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.override(size.getWidth(), size.getHeight.into(imageView); } @Override public void displayImage(Context context, String url, ImageView imageView, int defRes, boolean cacheInMemory) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.skipMemoryCache(cacheInMemory).into(imageView); } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, boolean cacheInMemory) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.skipMemoryCache(cacheInMemory).into(imageView); } /** * 只在需要的地方进行监听 listener 通过自定义的接口回调参数 * @param context * @param url * @param imageView * @param listener 监听资源加载的请求状态 但不要每次请求都使用新的监听器,要避免不必要的内存申请,可以使用单例进行统一的异常监听和处理 */ @Override public void displayImage(Context context, final String url, final ImageView imageView, final IImageLoaderListener listener) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { listener.onLoadingFailed(url, imageView, e); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { listener.onLoadingComplete(url, imageView); return false; } }).into(imageView); } @Override public void displayImage(Fragment fragment, final String url, final ImageView imageView, final IImageLoaderListener listener) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { listener.onLoadingFailed(url, imageView, e); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { listener.onLoadingComplete(url, imageView); return false; } }).into(imageView); } @Override public void displayImage(Context context, final String url, final ImageView imageView, int defRes, final IImageLoaderListener listener) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { listener.onLoadingFailed(url, imageView, e); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { listener.onLoadingComplete(url, imageView); return false; } }).into(imageView); } @Override public void displayImage(Fragment fragment, final String url, final ImageView imageView, int defRes, final IImageLoaderListener listener) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { listener.onLoadingFailed(url, imageView, e); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { listener.onLoadingComplete(url, imageView); return false; } }).into(imageView); } /** * 圆形图片的裁剪 * @param context * @param url * @param imageView * @param defRes */ @Override public void displayCircleImage(Context context, String url, ImageView imageView, int defRes) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.bitmapTransform(new GlideTransform(context, new CircleBitmapTransformation).into(imageView); } @Override public void displayCircleImage(Fragment fragment, String url, ImageView imageView, int defRes) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.bitmapTransform(new GlideTransform(imageView.getContext(), new CircleBitmapTransformation(imageView.getContext.into(imageView); } /** * * @param context * @param url * @param imageView * @param defRes * @param radius 倒圆角的图片 需要传入需要radius */ @Override public void displayRoundImage(Context context, String url, ImageView imageView, int defRes, int radius) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.bitmapTransform(new GlideTransform(context, new RoundBitmapTransformation(imageView.getContext(), radius))).into(imageView); } @Override public void displayRoundImage(Fragment fragment, String url, ImageView imageView, int defRes, int radius) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.bitmapTransform(new GlideTransform(imageView.getContext(), new RoundBitmapTransformation(imageView.getContext(), radius))).into(imageView); } /** * * @param context * @param url * @param blurRadius 模糊的程度 ,数字越大越模糊 * @param listener 接口回调需要拿到drawable */ @Override public void displayBlurImage(Context context, String url, int blurRadius, final IGetDrawableListener listener) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE). bitmapTransform(new GlideTransform(context, new BlurBitmapTransformation(context, blurRadius))). into(new SimpleTarget<GlideDrawable>() { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { if ( listener != null ) { listener.onDrawable( resource ); } } }); } /** * 不需要关系此模糊图的drawable * @param context * @param url * @param imageView * @param defRes * @param blurRadius */ @Override public void displayBlurImage(Context context, String url, ImageView imageView, int defRes, int blurRadius) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.bitmapTransform(new GlideTransform(context, new BlurBitmapTransformation(context, blurRadius))).into(imageView); } @Override public void displayBlurImage(Context context, int resId, ImageView imageView, int blurRadius) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).bitmapTransform(new GlideTransform(imageView.getContext(), new BlurBitmapTransformation(imageView.getContext(), blurRadius))).into(imageView); } @Override public void displayBlurImage(Fragment fragment, String url, ImageView imageView, int defRes, int blurRadius) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder.error.bitmapTransform(new GlideTransform(imageView.getContext(), new BlurBitmapTransformation(imageView.getContext(), blurRadius))).into(imageView); } /** * 加载资源文件 * @param context * @param resId * @param imageView */ @Override public void displayImageInResource(Context context, int resId, ImageView imageView) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView); } @Override public void displayImageInResource(Fragment fragment, int resId, ImageView imageView) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView); } /** * 加载资源文件的同时,对图片进行处理 * @param context * @param resId * @param imageView * @param transformations */ @Override public void displayImageInResource(Context context, int resId,ImageView imageView, IBitmapTransformation... transformations) { int size = transformations.length; GlideTransform[] glideTransforms = new GlideTransform[size]; for (int i = 0; i < size; i++) { glideTransforms[i] = new GlideTransform(transformations[i].getContext(), transformations[i]); } Glide.with.load.diskCacheStrategy(DiskCacheStrategy.NONE).transform(glideTransforms).into(imageView); } @Override public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, IBitmapTransformation... transformations) { int size = transformations.length; GlideTransform[] glideTransforms = new GlideTransform[size]; for (int i = 0; i < size; i++) { glideTransforms[i] = new GlideTransform(transformations[i].getContext(), transformations[i]); } Glide.with.load.diskCacheStrategy(DiskCacheStrategy.NONE).transform(glideTransforms).into(imageView); } /** * 加载资源文件失败了,加载中的默认图和失败的图片 * @param context * @param resId * @param imageView * @param defRes */ @Override public void displayImageInResource(Context context, int resId, ImageView imageView, int defRes) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.NONE).placeholder.error.into(imageView); } @Override public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, int defRes) { Glide.with.load.diskCacheStrategy(DiskCacheStrategy.NONE).placeholder.error.into(imageView); } //关心context @Override public void displayImageInResource(Context context, int resId, ImageView imageView, int defRes, IBitmapTransformation... transformations) { int size = transformations.length; GlideTransform[] glideTransforms = new GlideTransform[size]; for (int i = 0; i < size; i++) { glideTransforms[i] = new GlideTransform(transformations[i].getContext(), transformations[i]); } Glide.with.load.diskCacheStrategy(DiskCacheStrategy.NONE).placeholder.error.transform(glideTransforms).into(imageView); } //关心fragment @Override public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, int defRes, IBitmapTransformation... transformations) { int size = transformations.length; GlideTransform[] glideTransforms = new GlideTransform[size]; for (int i = 0; i < size; i++) { glideTransforms[i] = new GlideTransform(transformations[i].getContext(), transformations[i]); } Glide.with.load.diskCacheStrategy(DiskCacheStrategy.NONE).placeholder.error.transform(glideTransforms).into(imageView); }}

d、项目中调用的主体实现类:在此构建此类中需要注意两点:1、volatile 关键字:我个人理解的是:使用volatile关键字的程序在并发时能够正确执行。但是它不能够代替synchronized关键字。当初我在构建的此图片框架时,我领导说过,需加上此关键字,本人才疏学浅,能初步理解此用途,但是还是不够深入了解。但是在初期不加这个关键字,好像对图片加载并无什么影响。在网上找到这么一句话:观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令lock前缀指令实际上相当于一个内存屏障,内存屏障会提供3个功能:1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;2)它会强制将对缓存的修改操作立即写入主存;3)如果是写操作,它会导致其他CPU中对应的缓存行无效。2、synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,至于那些情况我也不太明白,因为涉及到java内存模型的相关概念,抛砖引玉一下:

public class ImageLoader implements IImageLoaderClient { private volatile static ImageLoader instance; private IImageLoaderClient client; private ImageLoader() { client = new GlideImageLoaderClient(); } /*** * 设置 图片加载库客户端 */ public void setImageLoaderClient(Context context, IImageLoaderClient client) { if (this.client != null) { this.client.clearMemoryCache; } if (this.client != client) { this.client = client; if (this.client != null) { this.client.init; } } } public static ImageLoader getInstance() { if (instance == null) { synchronized (ImageLoader.class) { if (instance == null) { instance = new ImageLoader(); } } } return instance; } @Override public void init(Context context) { } @Override public void destroy(Context context) { if (client != null) { client.destroy; client = null; } instance = null; } @Override public File getCacheDir(Context context) { if (client != null) { return client.getCacheDir; } return null; } @Override public void clearMemoryCache(Context context) { if (client != null) { client.clearMemoryCache; } } @Override public void clearDiskCache(Context context) { if (client != null) { client.clearDiskCache; } } @Override public Bitmap getBitmapFromCache(Context context, String url) { if (client != null) { return client.getBitmapFromCache(context, url); } return null; } @Override public void getBitmapFromCache(Context context, String url, IGetBitmapListener listener) { if (client != null) { client.getBitmapFromCache(context, url, listener); } } @Override public void displayImage(Context context, int resId, ImageView imageView) { if (client != null) { client.displayImage(context, resId, imageView); } } @Override public void displayImage(Context context, String url, ImageView imageView) { if (client != null) { client.displayImage(context, url, imageView); } } @Override public void displayImage(Context context, String url, ImageView imageView, boolean isCache) { if (client != null) { client.displayImage(context, url, imageView,isCache); } } @Override public void displayImage(Fragment fragment, String url, ImageView imageView) { if (client != null) { client.displayImage(fragment, url, imageView); } } @Override public void displayImage(Context context, String url, ImageView imageView, int defRes) { if (client != null) { client.displayImage(context, url, imageView, defRes); } } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes) { if (client != null) { client.displayImage(fragment, url, imageView, defRes); } } @Override public void displayImage(Context context, String url, ImageView imageView, int defRes, IBitmapTransformation... transformations) { if (client != null) { client.displayImage(context, url, imageView, defRes, transformations); } } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, IBitmapTransformation... transformations) { if (client != null) { client.displayImage(fragment, url, imageView, defRes, transformations); } } @Override public void displayImage(Context context, String url, ImageView imageView, int defRes, ImageSize size) { if (client != null) { client.displayImage(context, url, imageView, defRes, size); } } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, ImageSize size) { if (client != null) { client.displayImage(fragment, url, imageView, defRes, size); } } @Override public void displayImage(Context context, String url, ImageView imageView, int defRes, boolean cacheInMemory) { if (client != null) { client.displayImage(context, url, imageView, defRes, cacheInMemory); } } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, boolean cacheInMemory) { if (client != null) { client.displayImage(fragment, url, imageView, defRes, cacheInMemory); } } @Override public void displayImage(Context context, String url, ImageView imageView, IImageLoaderListener listener) { if (client != null) { client.displayImage(context, url, imageView, listener); } } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, IImageLoaderListener listener) { if (client != null) { client.displayImage(fragment, url, imageView, listener); } } @Override public void displayImage(Context context, String url, ImageView imageView, int defRes, IImageLoaderListener listener) { if (client != null) { client.displayImage(context, url, imageView, defRes, listener); } } @Override public void displayImage(Fragment fragment, String url, ImageView imageView, int defRes, IImageLoaderListener listener) { if (client != null) { client.displayImage(fragment, url, imageView, defRes, listener); } } @Override public void displayCircleImage(Context context, String url, ImageView imageView, int defRes) { if (client != null) { client.displayCircleImage(context, url, imageView, defRes); } } @Override public void displayCircleImage(Fragment fragment, String url, ImageView imageView, int defRes) { if (client != null) { client.displayCircleImage(fragment, url, imageView, defRes); } } @Override public void displayRoundImage(Context context, String url, ImageView imageView, int defRes, int radius) { if (client != null) { client.displayRoundImage(context, url, imageView, defRes, radius); } } @Override public void displayBlurImage(Context context, String url, int blurRadius, final IGetDrawableListener listener) { if (client != null) { client.displayBlurImage(context, url, blurRadius, listener); } } @Override public void displayRoundImage(Fragment fragment, String url, ImageView imageView, int defRes, int radius) { if (client != null) { client.displayRoundImage(fragment, url, imageView, defRes, radius); } } @Override public void displayBlurImage(Context context, String url, ImageView imageView, int defRes, int blurRadius) { if (client != null) { client.displayBlurImage(context, url, imageView, defRes, blurRadius); } } @Override public void displayBlurImage(Context context, int resId, ImageView imageView, int blurRadius) { if (client != null) { client.displayBlurImage(context, resId, imageView, blurRadius); } } @Override public void displayBlurImage(Fragment fragment, String url, ImageView imageView, int defRes, int blurRadius) { if (client != null) { client.displayBlurImage(fragment, url, imageView, defRes, blurRadius); } } @Override public void displayImageInResource(Context context, int resId, ImageView imageView) { if (client != null) { client.displayImageInResource(context, resId, imageView); } } @Override public void displayImageInResource(Fragment fragment, int resId, ImageView imageView) { if (client != null) { client.displayImageInResource(fragment, resId, imageView); } } @Override public void displayImageInResource(Context context, int resId, ImageView imageView, IBitmapTransformation... transformations) { if (client != null) { client.displayImageInResource(context, resId, imageView, transformations); } } @Override public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, IBitmapTransformation... transformations) { if (client != null) { client.displayImageInResource(fragment, resId, imageView, transformations); } } @Override public void displayImageInResource(Context context, int resId, ImageView imageView, int defRes) { if (client != null) { client.displayImageInResource(context, resId, imageView, defRes); } } @Override public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, int defRes) { if (client != null) { client.displayImageInResource(fragment, resId, imageView, defRes); } } @Override public void displayImageInResource(Context context, int resId, ImageView imageView, int defRes, IBitmapTransformation... transformations) { if (client != null) { client.displayImageInResource(context, resId, imageView, defRes, transformations); } } @Override public void displayImageInResource(Fragment fragment, int resId, ImageView imageView, int defRes, IBitmapTransformation... transformations) { if (client != null) { client.displayImageInResource(fragment, resId, imageView, defRes, transformations); } }}

使用的方式及其简单,一行带代码搞定

 //圆形图片 ImageLoader.getInstance().displayCircleImage(this,"http://imgsrc.baidu.com/imgad/pic/item/267f9e2f07082838b5168c32b299a9014c08f1f9.jpg",mImageView_1,R.mipmap.ic_launcher_round); //圆角图片 ImageLoader.getInstance().displayRoundImage(this,"http://imgsrc.baidu.com/imgad/pic/item/267f9e2f07082838b5168c32b299a9014c08f1f9.jpg",mImageView_2,R.mipmap.ic_launcher_round,20); //模糊图片 ImageLoader.getInstance().displayBlurImage(this,"http://imgsrc.baidu.com/imgad/pic/item/267f9e2f07082838b5168c32b299a9014c08f1f9.jpg",mImageView_3,R.mipmap.ic_launcher_round,20); //本地图片 ImageLoader.getInstance().displayImageInResource(this,R.mipmap.test,mImageView_4); ImageLoader.getInstance().displayImageInResource(this,R.mipmap.test,mImageView_5,new BlurBitmapTransformation; ImageLoader.getInstance().displayImageInResource(this,R.mipmap.test,mImageView_6,new CircleBitmapTransformation; ImageLoader.getInstance().displayImageInResource(this,R.mipmap.test,mImageView_6,new RoundBitmapTransformation;

2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;

3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断

4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

5)Lock可以提高多个线程进行读操作的效率

3、锁的概念

可重入锁

如果锁具备可重入性,则称作为可重入锁。像synchronized和ReentrantLock都是可重入锁,可重入性在我看来实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个synchronized方法时,比如说method1,而在method1中会调用另外一个synchronized方法method2,此时线程不必重新去申请锁,而是可以直接执行方法method2。

可中断锁

版权声明:本文由美高梅开户送58元官网发布于美高梅开户送58元官网,转载请注明出处:如果不能满足,锁定的是对象