Synchronized的作用:

能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果

Synchronized的两个用法:

1)对象锁

包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对 象)

2)类锁:

指Synchronized修饰静态的方法或指定锁为Class对象

 1 public class SynchronizedObjectCodeBlock2 implements Runnable {
2
3 static SynchronizedObjectCodeBlock2 intface = new SynchronizedObjectCodeBlock2();
4 Object lock1 = new Object();
5 Object lock2 = new Object();
6
7 @Override
8 public void run() {
9 synchronized (lock1) {
10 System.out.println("lock1部分。我叫:" + Thread.currentThread().getName());
11 try {
12 Thread.sleep(3000);
13 } catch (InterruptedException e) {
14 e.printStackTrace();
15 }
16 System.out.println(Thread.currentThread().getName() + "lock1部分运行结束!");
17 }
18
19 synchronized (lock2) {
20 System.out.println("lock2部分。我叫:" + Thread.currentThread().getName());
21 try {
22 Thread.sleep(3000);
23 } catch (InterruptedException e) {
24 e.printStackTrace();
25 }
26 System.out.println(Thread.currentThread().getName() + "lock2部分运行结束!");
27 }
28 }
29
30 public static void main(String[] args) {
31 Thread t1 = new Thread(intface);
32 Thread t2 = new Thread(intface);
33 t1.start();
34 t2.start();
35 while (t1.isAlive() || t2.isAlive()) {
36
37 }
38 System.out.println("finshed");
39 }
40 }

同步代码块锁

运行结果:

 1 public class SynchronizedObjectMethod3 implements Runnable {
2
3 static SynchronizedObjectMethod3 intface = new SynchronizedObjectMethod3();
4
5 @Override
6 public void run() {
7 method();
8 }
9
10 public static void main(String[] args) {
11 Thread t1 = new Thread(intface);
12 Thread t2 = new Thread(intface);
13 t1.start();
14 t2.start();
15 while (t1.isAlive() || t2.isAlive()) {
16
17 }
18 System.out.println("finshed");
19 }
20
21 public synchronized void method() {
22 System.out.println("我是对象锁的方法修饰符形式。我叫:"+ Thread.currentThread().getName());
23 try {
24 Thread.sleep(3000);
25 } catch (InterruptedException e) {
26 e.printStackTrace();
27 }
28 System.out.println(Thread.currentThread().getName()+"运行结束");
29 }
30 }

方法锁

运行结果:

 1 public class SynchronizedClassStatic4 implements Runnable {
2
3 static SynchronizedClassStatic4 intface1 = new SynchronizedClassStatic4();
4 static SynchronizedClassStatic4 intface2 = new SynchronizedClassStatic4();
5
6 @Override
7 public void run() {
8 method();
9 }
10
11 public static synchronized void method(){
12 System.out.println("我是类锁的第一种形式:static形式。我叫:"+ Thread.currentThread().getName());
13 try {
14 Thread.sleep(3000);
15 } catch (InterruptedException e) {
16 e.printStackTrace();
17 }
18 System.out.println(Thread.currentThread().getName()+"运行结束");
19 }
20
21 public static void main(String[] args) {
22 Thread t1 = new Thread(intface1);
23 Thread t2 = new Thread(intface2);
24 t1.start();
25 t2.start();
26 while (t1.isAlive() || t2.isAlive()) {
27
28 }
29 System.out.println("finshed");
30 }
31 }

类锁的第一种形式:static形式

运行结果:

 1 public class SynchronizedClassClass5 implements Runnable {
2
3 static SynchronizedClassClass5 intface1 = new SynchronizedClassClass5();
4 static SynchronizedClassClass5 intface2 = new SynchronizedClassClass5();
5
6 @Override
7 public void run() {
8 method();
9 }
10
11 public void method(){
12 synchronized (SynchronizedClassClass5.class){
13 System.out.println("我是类锁的第2种形式:synchronized (*.class)形式。我叫:"+ Thread.currentThread().getName());
14 try {
15 Thread.sleep(3000);
16 } catch (InterruptedException e) {
17 e.printStackTrace();
18 }
19 System.out.println(Thread.currentThread().getName()+"运行结束");
20 }
21 }
22
23 public static void main(String[] args) {
24 Thread t1 = new Thread(intface1);
25 Thread t2 = new Thread(intface2);
26 t1.start();
27 t2.start();
28 while (t1.isAlive() || t2.isAlive()) {
29
30 }
31 System.out.println("finshed");
32 }
33 }

类锁的第2种形式:synchronized (*.class)形式

运行结果:

多线程Synchronized的两种锁的更多相关文章

  1. WPF多线程UI更新——两种方法

    WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  2. 多线程通信的两种方式? (可重入锁ReentrantLock和Object)

    (一)Java中线程协作的最常见的两种方式: (1)利用Object的wait().notify()和notifyAll()方法及synchronized (2)使用Condition.Reentra ...

  3. JAVA多线程实现的两种方式

    java多线程实现方式主要有两种:继承Thread类.实现Runnable接口 1.继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了 ...

  4. JavaSE——多线程实现的两种方式

    Thread类: 创建新执行线程有两种方法. 一种方法是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例.例如,计算大于某一规定值的质 ...

  5. Java中的ReentrantLock和synchronized两种锁机制的对比

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  6. Java-将多线程停止的两种方法

    线程如何停止呢 stop方法过时了,看起描述发现,有其他解决方案. 线程结束:就是让线程任务代码执行完,run方法结束. run方法怎么结束呢? run方法中通常都定义循环,只要控制住循环就哦了. / ...

  7. SAP Fiori里两种锁机制(lock)的实现

    方法1: ETAG机制 SAP CRM Fiori采用了这种机制. 看一个具体的例子来理解.假设我用用户名Jerry选中了这个ID为3456的Opportunity,点击Edit按钮之后: 会触发一个 ...

  8. day36 joinablequeue、多线程理论、多线程的两种使用方式、守护线程、互斥锁、死锁、递归锁、信号量

    1.joinablequeue队列 joinablequeue与queue一样,也是一种队列,其继承自queue,也有queue中的put 与get 方法,但是在joinablequeue中有自己的 ...

  9. 【Java多线程】两种基本实现框架

    Java多线程学习1——两种基本实现框架 一.前言 当一个Java程序启动的时候,一个线程就立刻启动,改程序通常也被我们称作程序的主线程.其他所有的子线程都是由主线程产生的.主线程是程序开始就执行的, ...

随机推荐

  1. YARN调度器(Scheduler)详解

    理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...

  2. 啥是 MySQL 事务隔离级别?

    之前发过一篇文章,简单了解 MySQL 中相关的锁,里面提到了,如果我们使用的 MySQL 存储引擎为 InnoDB ,并且其事务隔离级别是 RR 可重复读的话,是可以避免幻读的. 但是没想到,都 1 ...

  3. synchronized锁代码块(七)

    synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...

  4. Python自动化测试面试题-Linux篇

    目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...

  5. Hexo搭建静态博客站点

    什么是Hexo? Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页. 本文将介绍如何在没有域名和云主机的 ...

  6. C实现奇偶校验

    奇偶校验原理(来自百度百科):奇偶校验(Parity Check)是一种校验代码传输正确性的方法.根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验.采用奇数的称 ...

  7. SQL Server CPU 利用率毛刺的分析定位与解决

    一.背景 1.1 问题描述 近期发现一台SQL Server的CPU利用率很不稳定,发现不定时的飙升到100%,更可怕的是在业务繁忙时,影响了业务调用,失败率明显增加,所以,减低CPU的利用率,是迫切 ...

  8. Java预科:DOS命令及电脑快捷键

    Java预科:DOS命令及电脑快捷键 1.快捷键 常用快捷键 a/t +f4关闭窗口 cmd窗口打开快捷方式 1.开始+系统+命令提示符 2.win+r 输入cmd 3.在任意文件夹下面,按住shif ...

  9. centos7 下安装docker报错:You could try using...

    搞了台VPS,想要装docker,发现死活装不上,各种报错.之前系统是centos6,发现官方现在已经不支持centos6了,遂升级到centos7,然后还是出现下面这个错误. Error: Pack ...

  10. node溢出

    在做项目的过程中,项目越来越大,后面导致项目无法正常启动,查了原因是因为node 溢出了. 先看看溢出时报的错 解决办法:  increase-memory-limit插件 1.在package.js ...