导航:首页 > 编程语言 > java锁几种方式

java锁几种方式

发布时间:2023-08-20 12:55:02

『壹』 java文件加锁机制是怎么实现的。

Java中文件加锁机制如下:
在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件。对文件的加锁方法有两种:
第一种方法:使用RandomAccessFile类操作文件。
在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:
RandomAccessFile raf = new RandomAccessFile(file, "rws");
其中的“rws”参数,rw代表读取和写入,s代表了同步方式,也就是同步锁。这种方式打开的文件,就是独占方式的。

第二种方法:使用sun.nio.FileChannel对文件进行加锁。
代码
RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
FileChannel fc = raf.getChannel();
FileLock fl = fc.tryLock();
if(fl.isValid())
System.out.println("You have got the file lock.");

以上是通过RandomAccessFile来获得文件锁的,方法如下:
代码:
FileOutputStream fos = new FileOutputStream("file.txt");
FileChannel fc = fos.getChannel(); //获取FileChannel对象
FileLock fl = fc.tryLock(); //or fc.lock();
if(null != fl)
System.out.println("You have got file lock.");
//TODO write content to file
//TODO write end, should release this lock
fl.release(); //释放文件锁
fos.close; //关闭文件写操作

如果在读文件操作的时候,对文件进行加锁,操作过程如下:
FileChannel也可以从FileInputStream中直接获得,但是这种直接获得FileChannel的对象直接去操作FileLock会报异常NonWritableChannelException,需要自己去实现getChannel方法,代码如下:
private static FileChannel getChannel(FileInputStream fin, FileDescriptor fd) {
FileChannel channel = null;
synchronized(fin){
channel = FileChannelImpl.open(fd, true, true, fin);
return channel;
}
}

其实,看FileInputStream时,发现getChannel方法与我们写的代码只有一个地方不同,即open方法的第三个参数不同,如果设置为false,就不能锁住文件了。缺省的getChannel方法,就是false,因此,不能锁住文件。

『贰』 java多线程‘锁’,是用什么锁的,有方法

synchronized关键字可以让你对一个对象加锁,
比如synchronized(this);表示对当前类对象加锁,这是一个排他所,即只有一个线程可以访问被synchronized的对象

『叁』 java中的锁有哪几种

lock比synchronized比较如下:

1) 支持公平锁,某些场景下需要获得锁的时间与申请锁的时间相一致,但是synchronized做不到
2) 支持中断处理,就是说那些持有锁的线程一直不释放,正在等待的线程可以放弃等待。如果不支持中断处理,那么线程可能一直无限制的等待下去,就算那些正在占用资源的线程死锁了,正在等待的那些资源还是会继续等待,但是ReentrantLock可以选择放弃等待
3) condition和lock配合使用,以获得最大的性能
JAVA中锁使用的几点建议:

1.如果没有特殊的需求,建议使用synchronized,因为操作简单,便捷,不需要额外进行锁的释放。鉴于JDK1.8中的ConcurrentHashMap也使用了CAS+synchronized的方式替换了老版本中使用分段锁(ReentrantLock)的方式,可以得知,JVM中对synchronized的性能做了比较好的优化。
2.如果代码中有特殊的需求,建议使用Lock。例如并发量比较高,且有些操作比较耗时,则可以使用支持中断的所获取方式;如果对于锁的获取,讲究先来后到的顺序则可以使用公平锁;另外对于多个变量的锁保护可以通过lock中提供的condition对象来和lock配合使用,获取最大的性能。

『肆』 JAVA锁有哪些种类,以及区别

常见的Java锁有下面这些:

『伍』 java分布式锁的实现方式有哪些

常用的有EJB、rmi、Web Service,还有Hessian、NIO等,它们的优缺点比较比下:
1:EJB
优势:可扩展性好,安全性强,支持分布式事务处理。
劣势:不能跨语言;配置相对复杂,不同J2EE容器之间很难做无缝迁移。
2:rmi
优势:面向对象的远程服务模型;基于TCP协议上的服务,执行速度快。
劣势:不能跨语言;每个远程对象都要绑定端口,不易维护;不支持分布式事务JTA,RMI框架对于安全性、事务、可扩展性的支持非常有限。
3: Web Service
优势:跨语言、跨,SOA思想的实现;安全性高;可以用来兼容legacy系统的功能
劣势:性能相对差,不支持两阶段事务
4:Hessian
优势:使用简单,速度快;跨语言,跨;可以用来兼容legacy系统的功能。
劣势:安全性的支持不够强,不支持两阶段事务。
5:NIO(Mina/Netty)
优点:基于TCP通信,效率上高于HTTP的方式,非阻塞IO应对高并发绰绰有余。根据具体的需要制定数据传输的格式,可扩展性强。
缺点:不能跨语言,无法穿透防火墙。
复制粘贴 不喜勿喷

『陆』 Java中有哪些锁,区别是什么

【1】公平所和非公平所。
公平锁:是指按照申请锁的顺序来获取锁,
非公平所:线程获取锁的顺序不一定按照申请锁的顺序来的。

//默认是不公平锁,传入true为公平锁,否则为非公平锁
ReentrantLock reentrantLock = new ReetrantLock();
1
2
【2】共享锁和独享锁
独享锁:一次只能被一个线程所访问
共享锁:线程可以被多个线程所持有。
ReadWriteLock 读锁是共享锁,写锁是独享锁。
【3】乐观锁和悲观锁。
乐观锁:对于一个数据的操作并发,是不会发生修改的。在更新数据的时候,会尝试采用更新,不断重入的方式,更新数据。
悲观锁:对于同一个数据的并发操作,是一定会发生修改的。因此对于同一个数据的并发操作,悲观锁采用加锁的形式。悲观锁认为,不加锁的操作一定会出问题,
【4】分段锁
1.7及之前的concurrenthashmap。并发操作就是分段锁,其思想就是让锁的粒度变小。
【5】偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价
轻量级锁
重量级锁
【6】自旋锁
自旋锁

阅读全文

与java锁几种方式相关的资料

热点内容
迅雷影音文件夹 浏览:109
makefile的文件路径 浏览:392
计算机程序文件名扩展名为 浏览:982
网络游戏推广策划案 浏览:609
替换所有文件内容的代码 浏览:960
不是常用数据模型有哪些 浏览:426
aspcms版本号 浏览:835
安卓怎么用数据流量下载软件 浏览:553
大众手动空调数据流通道号是多少 浏览:303
手机qq令牌 浏览:737
cg原画上色教程 浏览:993
婚介服务中心app怎么做 浏览:43
日本苹果66g多少钱 浏览:93
个性的文件夹名称 浏览:697
怎么设置文件打开密码 浏览:811
手机版qq客服代码怎么用 浏览:24
fme可以打开哪些文件 浏览:339
好看的qq密码 浏览:293
安卓唯一标识有哪些 浏览:243
win10ime 浏览:271

友情链接