java 同步锁方法

方法一:动态同步锁

class Demo_thread implements Runnable{
    public static int sum = 0;
    public synchronized void add(){//同步锁,为动态方法
        for(int i=0;i<5000;i++){
            sum = sum + 1;
        }
    }
    public void run(){
        add();
    }
}

动态同步锁适用于Runnable类中不适用与Thread类,因为其锁的对象为当前实例对象,一个Thread类只能跑一条线程,每条线程是不同的对象,所以同步锁将不起作用。

方法二:静态同步锁

class Demo_thread2 extends Thread{
    public static int sum = 0;
    public static synchronized void add(){//为静态方法
        for(int i=0;i<5000;i++){
            sum = sum + 1;
        }
    }
    public void run(){
        add();
    }
}

静态同步锁可以用于Thread类,因为静态方法在内存中只有一个实例,不会随着new新的对象而再创建实例。

方法三:代码块同步锁

class Demo_thread implements Runnable{
    public static int sum = 0;
    public void add(){
        for(int i=0;i<5000;i++){
            synchronized(this){//使用代码段同步锁,可以选择同步锁定
                sum = sum + 1; //一段代码,而不必要锁定整个方法
            }
        }
    }
    public void run(){
        add();
    }
}

代码块同步锁同样分为动态和静态,区分跟方法同步锁一样,定义动静态代码块同步锁的方法的区别是synchronized()跟的参数是动态还是静态,注意其接收的参数应该是一个实例对象,上面的方法中的this为传递本身,属于动态方法。下面为定义一段动态代码块同步锁的方法:

class Object{
//定义一个空类来给synchronized传参
}
class Demo_thread2 extends Thread{
    public static int sum = 0;
    public static Object lock = new Object();//实例化一个静态对象
    public void add(){
        for(int i=0;i<5000;i++){
             synchronized(lock){
                sum = sum + 1;
            }
        }
    }
    public void run(){
        add();
    }
}

方法四:使用lock方法

import java.util.concurrent.locks.ReentrantLock;
class Demo_thread3 implements Runnable{
    public static int sum = 0;
    private final ReentrantLock lock=new ReentrantLock();//创建ReentrantLock k对象
    public void add(){
        lock.lock();//获取锁 如果该锁被另一个线程保持,则出于线程调度的目的,
        for(int i=0;i<5000;i++){//禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态
            sum = sum + 1;
        }
        lock.unlock();
    }
    public void run(){
        add();
    }
}

因为每次调用线程的时候都会创建一个新的lock对象,所以同理当在Thread类中使用lock时把ReentrantLock的修饰语变成static 静态就行了。

时间: 2024-10-10 16:15:29

java 同步锁方法的相关文章

java 同步锁(synchronized)

java 同步锁(synchronized) 在java中,Synchronized就是一把锁,他可以锁定一个方法,也可以锁定一个方法,我擦,其实这两个东西就是一样的.块不就是一个没有名字的方法么,方法就是一个有名字的块.本文就用块来测试.所谓锁,就是原子操作,把这个锁定的块作为一个整体,就像你上厕所,拉了就要擦屁屁,当然你也可以不擦,如果你不在意出现的问题的话.信号量Semaphore和这个Synchronized 其实实现的功能差不多,不过效率不同,使用的方式也不同.Synchronized

Java同步锁

Java同步锁 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏.例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package cn.thread; public class Foo { private int x = 100; public int getX() { return x; } public int fix(int y) { x = x - y; return x; } } package cn.thread;

java同步锁的正确使用

同步锁分类 对象锁(this) 类锁(类的字节码文件对象即类名.class) 字符串锁(比较特别) 应用场景 在多线程下对共享资源的安全操作. 需求:启动5个线程对共享资源total进行安全操作. 同步锁在多线程单例模式下的使用 以上三类同步锁都可以. package cn.myThread; public class MyThread implements Runnable { private static int total = 10; @Override public void run()

Java同步锁——lock与synchronized 的区别【转】

一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将 unLock()放到finally{} 中: 2)synchronized在发生异常时,会

Java同步锁何时释放?

任何线程进入同步代码块.同步方法之前,必须获得同步监视器的锁定,那么何时会释放这个锁定呢?在程序中,是无法显式释放对同步监视器的锁的,而会在如下几个情况下释放锁. 1.当前线程的同步方法.代码块执行结束的时候释放 2.当前线程在同步方法.同步代码块中遇到break . return 终于该代码块或者方法的时候释放. 3.....出现未处理的error或者exception导致异常结束的时候释放 4.....程序执行了 同步对象 wait 方法 ,当前线程暂停,释放锁 ==============

Java多线程同步的方法

一 synchronized关键字 1.synchronized实现原理: ---基于对象监视器(锁) java中所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数变为0.在任务(线程)第一次给对象加锁的时候, 计数变为1.每当这个相同的任务(线程)在此对象上获得锁时,计数会递增.只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁.每当任务离开时,计数递减,当计数为0的时候,锁被完全释放. Java中每个对象或者类都有一把锁与之相关联,对于对象来说,监视

【Java】多线程冲突解决——同步锁

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827547.html 解决并行冲突最有效的方法就是加同步锁,主要有以下几种方法: 1:动态方法同步锁:锁当前对象.即调用该方法的类对象优先执行完毕才到下一个任务. public synchronized void 方法() { } 实例代码: import java.lang.Thread.State; import org.omg.CORBA.PUBLIC_MEMBER; public class Thr

JAVA中线程同步的方法

用什么关键字修饰同步方法 ? 用synchronized关键字修饰同步方法  同步有几种实现方法,都是什么?分别是synchronized,wait与notify wait():使一个线程处于等待状态,并且释放所持有的对象的lock.sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常.notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线

JAVA中线程同步的方法(7种)汇总

一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类. 二.同步代码块 即有synchronized关键字修饰的语句块. 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步 代码如: synchronized(object){ } 注:同步是一种高开销