synchronized关键字

原创 2016年05月31日 15:35:12

synchronized关键字

为什么需要同步关键字?因为存在并发,比较常见的例子是单例的懒汉模式,需要在获取对象的方法上加synchronized,不然可能产生new了2个对象的情况。

代码

public class TestSynchronized {

    /**
     * 同步方法
     */
    public static synchronized void staticMethod() {
        int i = 3;
        while (i-- > 0) {
            System.out.println(Thread.currentThread().getName() + " : " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
            }
        }
    }

    public synchronized void method() {
        int i = 3;
        while (i-- > 0) {
            System.out.println(Thread.currentThread().getName() + " : " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
            }
        }
    }

    public synchronized void method2() {
        int i = 3;
        while (i-- > 0) {
            System.out.println(Thread.currentThread().getName() + " : " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
            }
        }
    }

    public void objMethod() {
        synchronized (this) {
            int i = 3;
            while (i-- > 0) {
                System.out.println(Thread.currentThread().getName() + " : " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ie) {
                }
            }
        }
    }

    public void classMethod() {
        synchronized (TestSynchronized.class) {
            int i = 3;
            while (i-- > 0) {
                System.out.println(Thread.currentThread().getName() + " : " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ie) {
                }
            }
        }
    }

    /**
     * 1. 同步静态方法(类锁) <br/>
     * 2. 同步方法(对象锁) <br/>
     * 3. 同步对象代码(对象锁) <br/>
     * 4. 同步类代码(类锁) <br/>
     * 
     * 对象锁锁住当前对象,类锁锁住当前类,类锁和对象锁不冲突
     */
    public static void main(String[] args) {
        test1();
    }

    // test
    public static void test1() {
        final TestSynchronized ts1 = new TestSynchronized();
        final TestSynchronized ts2 = new TestSynchronized();
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                ts1.objMethod();
            }
        }, "thread1");
        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                ts2.classMethod();
            }
        }, "thread2");
        thread1.start();
        thread2.start();
    }
}

总结

1.同步的静态的方法(类锁)
2.同步的方法(对象锁)
3.同步的对象的代码(对象锁)
4.同步的类的代码(类锁)

对象锁锁住当前对象
类锁锁住当前类
类锁和对象锁不冲突

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java关于Synchronized关键字在不同位置使用的理解

Java中的Syncronized关键字可以用来修饰同步方法:像这样synchronized void f() {/*body*/}和同步语句块:像这样synchronized(object){/*b...
  • yuyuanhuang
  • yuyuanhuang
  • 2015年03月10日 15:58
  • 2280

Synchronized关键字详解

多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。   同步机制可以使用synchronized关键字实现。   当...
  • u010408365
  • u010408365
  • 2014年12月17日 16:02
  • 2042

探索Scala(8)-- 关键字

本文比较一下Java和Scala语言的关键字
  • SpiderDog
  • SpiderDog
  • 2014年11月04日 18:39
  • 4853

Java synchronized关键字_动力节点Java学院整理

  • 2017年11月07日 16:30
  • 200KB
  • 下载

Java并发编程---synchronized关键字

  • 2016年10月30日 16:26
  • 431KB
  • 下载

Java 多线程(六) synchronized关键字详解

Java 多线程(六) synchronized关键字详解   多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。   同步...
  • wu_cai_
  • wu_cai_
  • 2015年10月27日 16:48
  • 229

线程的同步(synchronized关键字)

package com.mipo.thread; /** * 线程的同步 大多数需要运行多线程的应用程序中,两个或多个线程需要共享对同一个数据的访问。 * 如果每个线程都会调用一个修改该数据状态...
  • qq_34416191
  • qq_34416191
  • 2016年06月29日 20:00
  • 231

线程死锁现象和synchronized 用作关键字和线程另一种创建方式

5月14日java学习笔记一.线程死锁1.出现死锁的条件:两个以上线程,并且线程之间相互需要对方拥有的资源 》》》 public void run() { i...
  • maniacxx
  • maniacxx
  • 2017年05月14日 21:50
  • 156

Java 并发编程(4) —— synchronized 关键字

1 什么时候会出现线程安全问题?  在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等...
  • HeatDeath
  • HeatDeath
  • 2018年01月01日 13:55
  • 500

Java并发编程:Lock类和synchronized关键字区别

以下是本文目录大纲:   一.synchronized的缺陷   二.java.util.concurrent.locks包下常用的类   三.锁的相关概念介绍   若有不正之处请多多谅解,并...
  • Hi_TYSONZHANG
  • Hi_TYSONZHANG
  • 2017年11月22日 17:06
  • 70
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:synchronized关键字
举报原因:
原因补充:

(最多只允许输入30个字)