1.demo

说明:代码中通过 printNum 方法传入参数判断 a、b 分别对 num 这个参数的值进行了修改。

package demo1;

import sun.applet.Main;

public class MyThread2 extends Thread {

    private  int num = 0;
public synchronized void printNum(String str) {
try {
if (str.equals("a")) {
num = 1000;
System.err.println("thread -> A over");
Thread.sleep(1000);
} else if (str.equals("b")) {
num = 200;
System.err.println("thread -> B over");
}
System.err.println("str:" + str + "\tnum:" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
//2个不同的对象,只能new一次
final MyThread2 n1 = new MyThread2();
final MyThread2 n2 = new MyThread2();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
n1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
n2.printNum("b");
}
});
t1.start();
t2.start();
}
}
结果输出:

      thread -> A over
      thread -> B over

      a休眠2秒后
      str:b num:200
      str:a num:1000

 

描述:

synchronized  结果中并没有发生作用,正常的结果应该是:先执行完a,在执行b。

Thread.sleep(1000): 让当前线程挂起、停顿,交出当前线程占用cpu的时间(在某个时间内,把资源给别人,当前线程在这个时间不占用),使其他线程与当前的线程抢占cpu资源,让2个线程重新分配资源,让另一个线程抢到资源并执行。

2.demo

package demo1;

import sun.applet.Main;
public class MyThread2 extends Thread { private static int num = 0;
public static synchronized void printNum(String str) { try {
if (str.equals("a")) {
num = 1000;
System.err.println("thread -> A over");
Thread.sleep(1000);
} else if (str.equals("b")) {
num = 200;
System.err.println("thread -> B over");
}
System.err.println("str:" + str + "\tnum:" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
//2个不同的对象,只能new一次
final MyThread2 n1 = new MyThread2();
final MyThread2 n2 = new MyThread2();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
n1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
n2.printNum("b");
}
});
t1.start();
t2.start();
}
}
结果输出:

      thread -> A over
      str:a num:1000
      thread -> B over
      str:b num:200

 

描述:多个线程多个锁,每个线程都会去拿到属于自己的锁,分别获得后,执行  synchronized  修饰的方法。

   1.synchronized  取得的锁都是对象锁,而不是把一段代码、方法的锁,多个线程就持有该所属的对象锁。2个对象,线程获取的就是2个不同的锁(相互午影响)。

   2.有一种情况就是【相同的锁】,就是在该方法 synchronized 使用static 关键字,表示锁定class类,类级别的锁(独占class类)。

synchronized 线程同步-类级别锁定的更多相关文章

  1. java synchronized 线程同步机制详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  2. java多线程之synchronized(线程同步)

    一.线程同步,主要应用synchronized关键字: public class TraditionalThreadSynchorinzed { public static void main(Str ...

  3. Java线程同步类容器和并发容器(四)

    同步类容器都是线程安全的,在某些场景下,需要枷锁保护符合操作,最经典ConcurrentModifiicationException,原因是当容器迭代的过程中,被并发的修改了内容. for (Iter ...

  4. Java synchronized 线程同步

    同步方法 class MyTheard4 implements Runnable{ private int ticket; public MyTheard4(int ticket) { this.ti ...

  5. synchronized 线程同步

    synchronized  通常用来形容一次方法的调用,调用一旦开始,调用者必须等到方法调用返回后,才能继续执行后续的操作. 1.demo package demo1; public class My ...

  6. 对象级别锁 vs 类级别锁(Java)

    前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...

  7. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  8. iOS多线程编程:线程同步总结

    1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一 ...

  9. C#多线程编程系列(三)- 线程同步

    目录 1.1 简介 1.2 执行基本原子操作 1.3 使用Mutex类 1.4 使用SemaphoreSlim类 1.5 使用AutoResetEvent类 1.6 使用ManualResetEven ...

随机推荐

  1. RabbitMQ 实践及使用

    目录 - 1. RabbitMQ的安装    - 1.1 配置好 epel    - 1.2 安装 RPM包    - 1.3 创建用户设置权限- 2. RabbitMQ组件- 3. RabbitMQ ...

  2. 调用微信JS-SDK接口上传图片

    最近要在微信上做个问卷调查,有个上传图片功能,折腾找了半天资料,都不好弄,最终打算调用微信提供的上传图片接口,实现上传图片功能!此功能最大的好处是可以在微信服务器上暂存图片,减少本地服务器图片的缓存, ...

  3. ora11g listener.ora

    配置内容方式1: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC) (KEY = EXTPROC152 ...

  4. 关于ueditor在Java中文件上传问题,404问题

    问题困扰了两天,部署要求导入到webcontent下,我导入到了整个项目目录下,自己粗心犯错,导致页面访问不到404. 解决了上面的问题,试着进行文件上传,却一直找不到图片: 调出浏览器控制台: 刚开 ...

  5. LeetCode解题报告—— Container With Most Water & 3Sum Closest & Letter Combinations of a Phone Number

    1.  Container With Most Water Given n non-negative integers a1, a2, ..., an, where each represents a ...

  6. 《深入浅出MyBatis技术原理与实战》——4. 映射器,5. 动态SQL

    4.1 映射器的主要元素 4.2 select元素 4.2.2 简易数据类型的例子 例如,我们需要统计一个姓氏的用户数量.应该把姓氏作为参数传递,而将结果设置为整型返回给调用者,如: 4.2.3 自动 ...

  7. Redis安装+密码认证

    redis: 安装: $ wget http://download.redis.io/releases/redis-3.2.7.tar.gz $ tar xzf redis-3.2.7.tar.gz ...

  8. Python Unicode与中文处理(转)

    Python Unicode与中文处理 python中的unicode是让人很困惑.比较难以理解的问题,本文力求彻底解决这些问题: 1.unicode.gbk.gb2312.utf-8的关系: htt ...

  9. web服务器解析漏洞总结(转)

    转:http://www.secpulse.com/archives/3750.html 解析漏洞总结 2015 /1/27 22:09 一.IIS 5.x/6.0解析漏洞 IIS 6.0解析利用方法 ...

  10. Word Ladder(LintCode)

    Word Ladder Given two words (start and end), and a dictionary, find the length of shortest transform ...