精华内容
下载资源
问答
  • 文件的加锁方法有两种:第一种方法:使用RandomAccessFile类操作文件。在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:RandomAccessFile raf = new RandomAccessFile(file, "rws");...

    在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件。对文件的加锁方法有两种:

    第一种方法:使用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;  //关闭文件写操作

    如果在读文件操作的时候,对文件进行加锁,怎么操作呢?从API文档中我们可以看到,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,因此,不能锁住文件。

    展开全文
  • 1.java多线程加锁加锁?答:当然是共享资源加锁啊,谁进行访问修改,就对象进行加锁。以便使多线程按序访问此共享对象比如:在具体的Java代码中需要完成一下两个操作:把竞争访问的资源类Foo变量x标识为...

    1.java多线程加锁是对谁加锁?

    答:当然是对共享资源加锁啊,对谁进行访问修改,就对象进行加锁。以便使多线程按序访问此共享对象

    比如:

    在具体的Java代码中需要完成一下两个操作:

    把竞争访问的资源类Foo变量x标识为private;

    同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    package cn.thread;

    public class Foo2 {

    private int x = 100;

    public int getX() {

    return x;

    }

    //同步方法

    public synchronized int fix(int y) {

    x = x - y;

    System.out.println("线程"+Thread.currentThread().getName() + "运行结束,减少“" + y

    + "”,当前值为:" + x);

    return x;

    }

    // //同步代码块

    // public int fix(int y) {

    // synchronized (this) {

    // x = x - y;

    // System.out.println("线程"+Thread.currentThread().getName() + "运行结束,减少“" + y

    // + "”,当前值为:" + x);

    // }

    //

    // return x;

    // }

    }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    package cn.thread;

    public class MyRunnable2 {

    public static void main(String[] args) {

    MyRunnable2 run = new MyRunnable2();

    Foo2 foo2=new Foo2();

    MyThread t1 = run.new MyThread("线程A", foo2, 10);

    MyThread t2 = run.new MyThread("线程B", foo2, -2);

    MyThread t3 = run.new MyThread("线程C", foo2, -3);

    MyThread t4 = run.new MyThread("线程D", foo2, 5);

    t1.start();

    t2.start();

    t3.start();

    t4.start();

    }

    class MyThread extends Thread {

    private Foo2 foo2;

    /**当前值*/

    private int y = 0;

    MyThread(String name, Foo2 foo2, int y) {

    super(name);

    this.foo2 = foo2;

    this.y = y;

    }

    public void run() {

    foo2.fix(y);

    }

    }

    }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    线程线程A运行结束,减少“10”,当前值为:90

    线程线程C运行结束,减少“-3”,当前值为:93

    线程线程B运行结束,减少“-2”,当前值为:95

    线程线程D运行结束,减少“5”,当前值为:90

    比如:

    对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。

    追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。

    在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    package cn.thread;

    /**

    * 线程同步方法

    *

    * @author 林计钦

    * @version 1.0 2013-7-24 上午10:12:47

    */

    public class ThreadSynchronizedCode {

    public static void main(String[] args) {

    ThreadSynchronizedCode t = new ThreadSynchronizedCode();

    User u = t.new User("张三", 100);

    MyThread t1 = t.new MyThread("线程A", u, 20);

    MyThread t2 = t.new MyThread("线程B", u, -60);

    MyThread t3 = t.new MyThread("线程C", u, -80);

    MyThread t4 = t.new MyThread("线程D", u, -30);

    MyThread t5 = t.new MyThread("线程E", u, 32);

    MyThread t6 = t.new MyThread("线程F", u, 21);

    t1.start();

    t2.start();

    t3.start();

    t4.start();

    t5.start();

    t6.start();

    }

    class MyThread extends Thread {

    private User u;

    /**存款金额*/

    private int y = 0;

    MyThread(String name, User u, int y) {

    super(name);

    this.u = u;

    this.y = y;

    }

    public void run() {

    u.oper(y);

    }

    }

    class User {

    /** 账号 */

    private String code;

    /** 余额 */

    private int cash;

    User(String code, int cash) {

    this.code = code;

    this.cash = cash;

    }

    public String getCode() {

    return code;

    }

    public void setCode(String code) {

    this.code = code;

    }

    /**

    * 存款

    *

    * @param x 欲存款金额

    *

    */

    public void oper(int x) {

    try {

    Thread.sleep(10L);

    synchronized (this) {

    this.cash += x;

    System.out.println("线程" + Thread.currentThread().getName() + "运行结束,增加“" + x

    + "”,当前用户账户余额为:" + cash);

    }

    Thread.sleep(10L);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    @Override

    public String toString() {

    return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}';

    }

    }

    }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    线程线程B运行结束,增加“-60”,当前用户账户余额为:40

    线程线程A运行结束,增加“20”,当前用户账户余额为:60

    线程线程C运行结束,增加“-80”,当前用户账户余额为:-20

    线程线程D运行结束,增加“-30”,当前用户账户余额为:-50

    线程线程F运行结束,增加“21”,当前用户账户余额为:-29

    线程线程E运行结束,增加“32”,当前用户账户余额为:3

    展开全文
  • java对文件加锁

    2016-11-23 19:24:00
    文件操作过程中,有时候需要文件进行加锁操作,...文件的加锁方法有两种: 第一种方法:使用RandomAccessFile类操作文件。 在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:...

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt208

    在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件。对文件的加锁方法有两种:

    第一种方法:使用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;  //关闭文件写操作

     

    如果在读文件操作的时候,对文件进行加锁,怎么操作呢?从API文档中我们可以看到,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,因此,不能锁住文件。

    转载于:https://www.cnblogs.com/grefr/p/6094917.html

    展开全文
  • 1.java多线程加锁加锁? 答:当然是共享资源加锁啊,谁进行访问修改,就对象进行加锁。以便使多线程按序访问此共享对象 比如: 在具体的Java代码中需要完成一下两个操作:把竞争访问的资源类Foo变量x...

    1.java多线程加锁是对谁加锁?

    答:当然是对共享资源加锁啊,对谁进行访问修改,就对象进行加锁。以便使多线程按序访问此共享对象

     比如:

    在具体的Java代码中需要完成一下两个操作:
    把竞争访问的资源类Foo变量x标识为private;
    同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。

    复制代码
    package cn.thread;
    
    public class Foo2 {
        private int x = 100;
    
        public int getX() {
            return x;
        }
    
        //同步方法
        public synchronized int fix(int y) {
            x = x - y;
            System.out.println("线程"+Thread.currentThread().getName() + "运行结束,减少“" + y
                    + "”,当前值为:" + x);
            return x;
        }
        
    //    //同步代码块
    //    public int fix(int y) {
    //        synchronized (this) {
    //            x = x - y;
    //            System.out.println("线程"+Thread.currentThread().getName() + "运行结束,减少“" + y
    //                    + "”,当前值为:" + x);
    //        }
    //        
    //        return x;
    //    }
    
    }
    复制代码
    复制代码
    package cn.thread;
    
    
    
    public class MyRunnable2  {
    
        public static void main(String[] args) {
            MyRunnable2 run = new MyRunnable2();
            Foo2 foo2=new Foo2();
            
            MyThread t1 = run.new MyThread("线程A", foo2, 10);
            MyThread t2 = run.new MyThread("线程B", foo2, -2);
            MyThread t3 = run.new MyThread("线程C", foo2, -3);
            MyThread t4 = run.new MyThread("线程D", foo2, 5);
            
            t1.start();
            t2.start();
            t3.start();
            t4.start();
        }
        
        class MyThread extends Thread {
            private Foo2 foo2;
            /**当前值*/
            private int y = 0;
            
            MyThread(String name, Foo2 foo2, int y) {
                super(name);
                this.foo2 = foo2;
                this.y = y;
            }
    
            public void run() {
                foo2.fix(y);
            }
        }
    
    }
    复制代码
    线程线程A运行结束,减少“10”,当前值为:90
    线程线程C运行结束,减少“-3”,当前值为:93
    线程线程B运行结束,减少“-2”,当前值为:95
    线程线程D运行结束,减少“5”,当前值为:90

    比如:

    对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。

    追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。

    在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。

    复制代码
    package cn.thread;
    
    /**
     * 线程同步方法
     * 
     * @author 林计钦
     * @version 1.0 2013-7-24 上午10:12:47
     */
    public class ThreadSynchronizedCode {
        public static void main(String[] args) {
            ThreadSynchronizedCode t = new ThreadSynchronizedCode();
            User u = t.new User("张三", 100);
            MyThread t1 = t.new MyThread("线程A", u, 20);
            MyThread t2 = t.new MyThread("线程B", u, -60);
            MyThread t3 = t.new MyThread("线程C", u, -80);
            MyThread t4 = t.new MyThread("线程D", u, -30);
            MyThread t5 = t.new MyThread("线程E", u, 32);
            MyThread t6 = t.new MyThread("线程F", u, 21);
    
            t1.start();
            t2.start();
            t3.start();
            t4.start();
            t5.start();
            t6.start();
        }
    
        class MyThread extends Thread {
            private User u;
            /**存款金额*/
            private int y = 0;
            
            MyThread(String name, User u, int y) {
                super(name);
                this.u = u;
                this.y = y;
            }
    
            public void run() {
                u.oper(y);
            }
        }
    
        class User {
            /** 账号 */
            private String code;
            /** 余额 */
            private int cash;
    
            User(String code, int cash) {
                this.code = code;
                this.cash = cash;
            }
    
            public String getCode() {
                return code;
            }
    
            public void setCode(String code) {
                this.code = code;
            }
    
            /**
             * 存款
             * 
             * @param x 欲存款金额
             *            
             */
            public void oper(int x) {
                try {
                    Thread.sleep(10L);
                    synchronized (this) {
                        this.cash += x;
                        System.out.println("线程" + Thread.currentThread().getName() + "运行结束,增加“" + x
                                + "”,当前用户账户余额为:" + cash);
                    }
                    Thread.sleep(10L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public String toString() {
                return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}';
            }
        }
    }
    复制代码
    线程线程B运行结束,增加“-60”,当前用户账户余额为:40
    线程线程A运行结束,增加“20”,当前用户账户余额为:60
    线程线程C运行结束,增加“-80”,当前用户账户余额为:-20
    线程线程D运行结束,增加“-30”,当前用户账户余额为:-50
    线程线程F运行结束,增加“21”,当前用户账户余额为:-29
    线程线程E运行结束,增加“32”,当前用户账户余额为:3

    转载于:https://www.cnblogs.com/panxuejun/p/5957100.html

    展开全文
  • java的静态方法加锁与一般方法加锁

    万次阅读 2018-01-15 20:57:24
    第一部分: synchronized 与static synchronized 的区别 ...第二部分:java多线程锁,源码剖析 ...synchronized是类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块。
  • synchronized是类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块。每个对象都有一个锁,且是唯一的。 注意: 1.指的是“类的当前实例”, 类的两个不同实例就没有这种...
  • 这时候就需要修改操作进行加锁,让jvm里同一时刻只能有一个线程能够执行修改方法。下面是一个未加锁的修改方法:publicvoidupdate(Entryentry){dao.update(entry);}现在讨论下传统的加锁方法。我们知道每一个...
  • 从一个问题说起一直想要把一些学习历程和感悟记录下来,却没有静下心来好好思考一下,今天,就从同学问到的一个问题开始,同一个类的静态方法加锁后,调用该方法,其他方法的调用会受到影响吗?对象锁与类锁java中...
  • 问题:如果写一个接口,其他人调用这个结果的时候,根据接口的参数来加锁。环境:因为没有写demo 的习惯,所以都是直接在真实项目里面做的示例。后台:Spring boot 写的接口前台:vue 写的网络请求话不多说:上代码@...
  • 1. 如何用数组实现队列?用数组实现队列时要注意 溢出 现象,这时我们...局部变量在方法结束后就会被销毁,但内部类对象并不一定,这样就会导致内部类引用了一个不存在的变量。所以编译器会在内部类中生成一个局部...
  • Synchronized修饰非静态方法,是调用该方法的对象加锁,俗称“对象锁”。 这里的对象加锁并非是说执行该加锁方法的时候整个对象的所有成员都不允许其他线程访问了, 而是说该对象内所有的加锁的非静态方法共用这...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼synchronized有几种用法给方法加锁也就是在声明方法时加上synchronized关键字,这样同时就只能有一个线程访问该方法其次就是代码块,synchronized(xx){xxx}但是之前我...
  • java中文件加锁机制

    千次阅读 2013-12-11 20:44:00
    当同时一个文件进行操作的时候,很可能出现错误甚至锁坏文件。 在某些情况下,有一个应用的两个实例同事操作一个文件,第一个实例应该锁定这个文件,第二个实例发现这个文件被锁定,是等待它解锁还是跳过文件操作...
  • java中同步加锁的几种方式

    千次阅读 2013-12-17 14:11:10
    同步加锁的几种方式: 1、使用静态代码块 ...2、对方法进行加锁 public synchronized void add() {} 3、 Integer y = 5;//OK使用一个定值 synchronized (同步加锁.class、y、) {} 4、String s
  • 从一个问题说起一直想要把一些学习历程和感悟记录下来,却没有静下心来好好思考一下,今天,就从同学问到的一个问题开始,同一个类的静态方法加锁后,调用该方法,其他方法的调用会受到影响吗?对象锁与类锁java中...
  • 从一个问题说起一直想要把一些学习历程和感悟记录下来,却没有静下心来好好思考一下,今天,就从同学问到的一个问题开始,同一个类的静态方法加锁后,调用该方法,其他方法的调用会受到影响吗?对象锁与类锁java中...
  • java 文件进行加锁

    千次阅读 2013-05-07 11:05:13
    查看 java.util.concurrent.locks包下的类ReentrantReadWriteLock 方法摘要 protected Thread getOwner() 返回当前拥有写入锁的线程,如果没有这样的线程,则返
  • java多线程编程--抽象方法加锁

    千次阅读 2013-10-24 08:58:32
    java多线程编程--抽象方法加锁 最近在开发中遇到很多问题,其中问题一就是需要一个抽象方法,但是同时需要它加上资源锁.以前我是不知道抽象方法到底能不能加上资源锁的,看完下面的文章我知道了: 这里要先...
  • 一直想要把一些学习历程和感悟记录下来,但是未曾静下心来好好思索一下,今天,就从朋友问到的一个问题开始,静态方法加锁后,其他方法会受影响吗? 对象锁与类锁 java中每一个对象都持有一把锁–monitor,monitor...
  • 锁锁的三个问题锁是一种互斥的机制,在多线程环境中实现资源的强制控制,以帮助实现并发控制。锁的使用会带来三个问题:1. 锁开销。锁会占用内存空间。锁的初始化,销毁,获取和释放,都需要消耗CPU时间。2. 锁...
  • Java程序MySQL数据库加锁实验,以下实验仅在MYSQL 5.0.45做的实验.以下实验仅在MYSQL 5.0.45做的实验.方法1:用mysql命令锁住表.pstmt.executeQuery();pstmt1.executeQuery();pstmt2.executeQuery();}}一、对于read...
  • 方法1:用mysql命令锁住表.public void test() {String sql = "lock tables aa1 write";// 或String sql = "lock tables aa1 read";// 如果想锁多个表 lock tables aa1 read ,aa2 write , .....String sql1 = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,065
精华内容 426
关键字:

java对方法加锁

java 订阅