如何处理java.lang.UnsatisfiedLinkError?
1、请查看控制台的错误信息a:如果控制台的消息是类似java.lang.UnsatisfiedLinkError: no MRChkLib in java.library.path,Error loading library MRChkLib这样的错误信息,那么是因为MRChkLib.dll没有拷贝到windows的System32目录下. (MRChkLib.dll是加密锁的JAVA接口文件,文件在报表安装目录DogDriver\JavaAPI下可以找到) 并且要注意PATH环境变量中要包含System32目录。
(如果服务器操作系统是Linux,那么使用报表安装目录DogDriver\JavaAPI 下的libMRChkLib.so文件,将libMRChkLib.so复制到WebServer的启动bin目录。
如果在这个目录下仍然出现can not load library错误,请设置系统环境变量LD_LIBRARY_PATH的值为libMRChkLib.so所在的目录。
Java语言如何正确实现Redis分布式锁?
和大家分享我的经验,如何用redis提供的一个简单接口,轻松实现redis分布式锁。
在开始之前,我先简单介绍下redis的性能。
高效的Redis
Redis本身是单线程的,这样带来的好处是能够提高读写效率。多线程通常来说会有上下文切换带来的时间损耗,而redis通过绑定单个CPU到某块内存,实现了上下文切换的最小开销,因此这种场景反而比多线程还要高效。
不安全的Redis
但是,如果有不同的节点同时要对Redis中的同一个数据进行操作,由于是来自不同Redis服务器,就会发生线程不安全的情况。
举例有两个功能函数X和Y(也可以看做是两个服务器节点),二者功能相同,都要执行读取Redis中变量P,并且对其加一的操作。如果是线程安全的,那么X和Y分别执行完之后,P的值应该比原来增加2,但是由于函数XY互相独立,那就可能发生下面这种情况:
1 X读取P
2 Y读取P
3 X将P+1写回Redis
4 Y将P+1写回Redis
执行结束后,P的值却变成了P+1,而不是P+2。
这就是线程不安全导致的结果。
redis的分布式锁
那么如何用Redis来避免上面的情况呢。
Redis对外开放了一个非常厉害的api,目前经常被大家用来做分布式锁,是绝对的线程安全,这个函数就是SET key field value加上NX参数。这个NX参数可是了不得,通常来说,set函数是不管field字段是否存在,只要写入成功就会返回1,但是如果增加了NX参数,那么如果field值在redis中已经存在,就会返回nil,否则才返回1。因此可以通过这个函数来执行加锁操作,如果返回值不为nil,则加锁成功,否则代表有其他线程在操作数据,当前请求需要等待。
不仅如此,为了避免死锁,SET还有一个参数为EX,即EX毫秒后,field会自动清空。
此外,还有PX,XX参数,具体含义见如下文档。
以上就是我在工作中总结的防止redis并发的方式,如果你有其他想法,欢迎在下方评论区与我沟通。
我是苏苏思量,来自BAT的java开发工程师,每天分享技术见闻,欢迎关注我,与我共同进步。
Java中非static的synchronized方法和synchronized(this)用的是一个锁吗?
Java中非static的synchronized方法和synchronized(this)用的是一把锁,这也说明非静态方法中的synchronized(this)和synchronized关键字
是Java支持中同一把锁。
在Java中,synchronized是用来表示同步的,既可以用synchronized来修饰一个方法,也可以修饰方法里的语句块。
在static方法和非static方法前面加synchronized的区别在于
static的方法属于类方法,它属于Class类范畴,所以static获取到的锁,是属于类的锁。
非static方法获取到的锁,是属于当前对象的锁。
再回到问题它们是一把锁,synchronized是针对一个临界区的,临界区指访问这个地方最多只能在一个线程里面,
它在对象上加锁后进入临界区以此来达到临界区串行访问的目的。
希望可以帮到你!!!