9月 052019
 
一、饿汉模式

饿汉模式在声明静态内部对象时就创建该对象,就是不管在程序中是否用到这个静态对象都会创建它,对于不一定会使用该对象的程序是一种资源的浪费,代码如下:

因为饿汉模式在声明的时候就创建了,所以不会有线程安全问题

二、懒汉模式

懒汉模式,即在使用的时候才去创建它,相对于饿汉他有点懒,但其实他不懒

代码如下:

假如在多个线程中都会用到这个单例对象,那么就有可能造成实例出多个对象的问题了,就是这种方式是线程不安全的

三、锁方法的懒汉模式(不推荐使用)

我们在instance()方法前加上synchronized修饰,这样多个线程就不可能同时进入instance方法了,也不会造成new多个实例的问题了

代码如下:

四、局部锁(不可使用)

这种方式看似加了一个锁,但是多个线程可能同时进入到if的判断语句中,同样不能保证_singleton的唯一性

五、双重检查锁+volatile修饰(推荐使用)

代码如下:

 

 Posted by on 2019-09-05

Java数据类型转换的一些问题总结

 分类:Java, Java语言, Uncategorized 阅读 (66)  Java数据类型转换的一些问题总结已关闭评论
8月 062019
 
一、强制类型转换导致数据的变化

举例:short类型的值范围为-32768 ~ 32767,看下面这些对short值的操作

最后的输出结果为:

二、关于一些运算后生成的默认值

对于长度小于或者等于int的数据类型,如short, byte在进行如下运算后,其他运算结果为int型

<<,>>,>>>,&,|,^,+,-,*,/

如下代码,就会提示你将运算强制转换成short类型

三、有符号数转无符号数

可以通过&运算将有符号号转为无符号数,

对于byte类型& 0xFF,

对于short类型& 0xFFFF,

对于int类型& 0xFFFFFFFF

注意&运算完的结果是一个int型的值

下面看一个示例代码:

运行结果:

强制类型转换并没有改变符号。

四、负数的左移位操作

负数的左移位操作会使数据保持为负数

http://bcoder.com/java/right-shift-operator-in-java

 Posted by on 2019-08-06

树莓派gpio编程(一)控制Led灯

 分类:C++, Linux, Operating System, Others, Uncategorized 阅读 (183)  树莓派gpio编程(一)控制Led灯已关闭评论
7月 112019
 
一、编程语言

  个人比较喜欢c语言,所以后面的编程都会使用c语言。

  使用c语言的话可以使用用wiringPi类库。

  1、查看是否安装wiringPi类库,输入下面的命令,如果返回版本信息则表示已安装wiringPi库

  2、如果没有安装,输入下面的命令安装

  3、wiringPi源码

  github上有一个wiringPi的代码库,但那个并不是wiringPi的源码,其源码在下面这个地址中

  https://git.drogon.net/

二、硬件连接

  将Led灯的两个针脚分别连到GND和GPIO0两个接口上,网上有的教程还说要连上一个电阻,但是俺没有,就直接连上了。

三、软件编写

  新建一个ledblink.c文件,然后输入下面的代码

四、软件编译

  输入下面的命令编译

五、执行程序查看效果

  编译完成后,会生成一个ledblink的可执行程序,输入./ledblink运行,看led灯是不是开始闪烁了!

 Posted by on 2019-07-11

LOCAL_MODULE_TAGS 选项说明

 分类:Uncategorized 阅读 (117)  LOCAL_MODULE_TAGS 选项说明已关闭评论
6月 132018
 

LOCAL_MODULE_TAGS :=user debug eng tests optional

user: 指该模块只在user版本下才编译

debug: 批该模块只在userdebug版本下才编译

eng: 指该模块只在eng版本下才编译

tests: 指该模块只在tests版本下才编译

optional:指该模块在所有版本下都编译

 Posted by on 2018-06-13
5月 152018
 

1. gRPC – 远程RPC框架

适用平台:c++、Java、Python、Php、Js等多平台

2. Netty -基于Java NIO client-server的网络应用框架

适用平台:Java

3. thrift – 用于可扩展的跨语言服务开发,简单来说就是RPC远程调用,它是一个完整的 RPC 框架体系。 

适用平台:Actionscript 3.0、c_glib、C++、CSharp、D、Dart、Delphi、Go、Graphviz、Haxe Framework、Haskell、Java、Javascript、Node.js、OCaml、Perl、PHP、Python、Ruby

4. SOME/IP(vsomeip) – 用于车载的远程通讯框架,特点:服务发现\带宽预留,符合autosar(汽车开放系统架构)标准.SOME/IP是指协议栈,vsomeip是用c++的实现

适用平台:C/C++

 Posted by on 2018-05-15
4月 092018
 

疑问一:如果创建Handler没有为Handler指定Looper,那么Handler用的是哪个Looper?

答:如果没有指定Looper的话,程序会通过Looper.myLooper();来获取当前线程中保存的Looper对象.

扩展:如果一个线程中没有Looper实例,则在创建Handler时即会触发异常

疑问二:如果在程序中建立了多个Handler,都使用同一个Looper(如使用主线程的Looper),那么消息会在每个Handler中都被处理吗?

答:不会,可以看下Handler代码中,enqueueMessage函数里面,将msg.target设置为了Handler本身.而在Looper的loop函数中,是通过msg.target.dispatchMessage(msg);将消息分发出去的,所以不会造成Handler接收消息的错乱.

疑问三:一个线程能不能有多个Looper?

答:不能,Looper的构造函数是私有的,Looper只能通过它的静态方法prepare()函数来创建,这个函数会检查当前线程中是否已有Looper实例,如果已有会报异常,如果没有则创建一个新的.

疑问四:Handler内存泄漏的原理?

Handler内存泄漏是因为,如果创建非静态的内部Handler类,会隐式的持有外部类的实例,所以当Activity销毁时,Handler有未执行的消息时,就会造成内在的泄漏.

并不是有静态内部Handler类就会引起内存泄漏,假如在Activity销毁后,Handler没有继续要执行的工作,也不会造成内存泄漏。

 Posted by on 2018-04-09
3月 302018
 

1.adb remount的作用就是重新挂载安卓的系统分区,使系统分区可读写

2.执行该功能其他的方法:

adb shell su #进入安卓命令行

mount -o rw,remount /system #将文件系统remount为读写权限

记得完事后remount回只读: mount -o ro,remount /system

3.另外一种方法

adb shell su #进入安卓命令行

mount -o rw,remount -t ext3 /dev/block/mmcblk1p21 /system

 Posted by on 2018-03-30
2月 202018
 

 具体请看下面的表格:

♠ frameworks/base/core/java/android/app/ActivityManagerNative.java

§ ActivityManagerNative.getDefault() 很简单,获取gDefault
§ gDefault 一个静态变量,是ActivityManagerService 的代理对象

♠ frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

ActivityRecord.isInStackLocked(token); 查询当前Activity是否还在Activity栈中?
如果还在继续执行Binder.clearCallingIdentity();保存此Activity在Binder中的id,稍候就会使用overridePendingAppTransition执行恢复的操作。
如果当前Activity的状态是活动状态或者将要暂停状态,执行WindowManagerService的overridePendingAppTransition

♠ frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

调用AppTransition的overridePendingAppTransition方法(将动画的设置信息都放在AppTransition中了)
然后WindowManagerService在进行Activity切换的时候就会根据AppTransition的动画设置来显示切换动画了。

 

总结:

1. 执行overridePendingTransition时的调用顺序ActivityManageService->WindowManageService

2. 最终设置的是WindowManagerService的overridePendingAppTransition

3. 和Windows编程中显示模式窗口不同,执行startActivity时并没有立即暂停当前Activity,而是通过Handler在下一个MessageQueue的处理中暂停的当前Activity

 Posted by on 2018-02-20

error: insufficient permissions for device问题解决

 分类:Uncategorized 阅读 (84)  error: insufficient permissions for device问题解决已关闭评论
6月 122017
 

一、问题

通过adb连接android设备时,出现了如下错误:

error: insufficient permissions for device: user in plugdev group; are your udev rules wrong?
See [http://developer.android.com/tools/device.html] for more information

二、解决办法

首先在插上usb设备和拔下设备时各执行一次lsusb命令,可以看到插上设备比拔掉设备时结果多出一行,如下:

可以看到多了一行

Bus 001 Device 007: ID 2207:0010

然后我们编辑/etc/udev/rules.d/下的51-android.rules文件(如果没有则新建一个此文件),执行命令:

然后在文件中增加一行如下内容:

保存文件后,给51-android.rules加上权限

再重新插上usb线就可以了。

 Posted by on 2017-06-12
5月 302017
 

  这个精度的损失给本人造成了精神损失! :cry: 

  整数相除,然后用ceil向上取整,本以为多简单个事,但是搞了半天,整数直接相除得到的结果必定是个整数,即使你把这个结果赋值给一个符点型的变量。

  后来才想起来需要强制转换其中一个为符点数然后再相除才可以。看下面的例子:

  输出结果:

  这个例子很简单,我就不解释啦!

  关键是有什么办法可以避免这个问题再发生?不能只凭记忆吧?!

 

 

 Posted by on 2017-05-30