Java多线程synchronized关键字
synchronized关键字代表着同步的意思,在Java中被synchronized修饰的有三种情况
1.同步代码块
//锁为obj
synchronized(obj){
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
2.同步函数
//锁为this
public synchronized void consume() {
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
3.静态同步函数
//锁为this.getClass()
static public synchronized void consume() {
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
死锁案例
1.同步嵌套
package threaddemo; public class DeathLock {
public static void main(String[] args) {
Callable c1 = new Callable(true);
Callable c2 = new Callable(false); Thread t1 = new Thread(c1);
Thread t2 = new Thread(c2); t1.start();
/*try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
t2.start();
}
} class MyLock {
static final public Object locka = new Object();
static final public Object lockb = new Object();
} class Callable implements Runnable {
private boolean flag; public Callable(boolean flag) {
this.flag = flag;
} @Override
public void run() {
String name = Thread.currentThread().getName();
if (flag) {
synchronized (MyLock.locka) {
System.out.println(name+":获取到了locka");
synchronized (MyLock.lockb) {
System.out.println(name+":获取到了lockb");
}
System.out.println(name+":释放了lockb");
}
System.out.println(name+":释放了locka"); } else {
synchronized (MyLock.lockb) {
System.out.println(name+":获取到了lockb");
synchronized (MyLock.locka) {
System.out.println(name+":获取到了locka");
}
System.out.println(name+":释放了locka");
}
System.out.println(name+":释放了lockb");
}
}
}
2.多生产者多消费者时只使用notify(),线程通讯死锁
解决办法采用notifyAll代替notify,唤醒所有线程就不会导致死锁
package threaddemo; /**
* 多生产者消费者线程通讯死锁
* @author wpy
*
*/
public class ProducerConsumerDeathLock {
public static void main(String[] args) {
Resource resource = new Resource(); Producer producer0 = new Producer(resource);
Producer producer1 = new Producer(resource); Consumer consumer2 = new Consumer(resource);
Consumer consumer3 = new Consumer(resource); Thread t0 = new Thread(producer0);
Thread t1 = new Thread(producer1);
Thread t2 = new Thread(consumer2);
Thread t3 = new Thread(consumer3); t0.start();
t1.start(); t2.start();
t3.start(); } } class Producer implements Runnable {
private Resource resource; public Producer(Resource resource) {
this.resource = resource;
} @Override
public void run() {
while (true) {
resource.set("资源");
}
}
} class Consumer implements Runnable {
private Resource resource; public Consumer(Resource resource) {
this.resource = resource;
} @Override
public void run() {
while (true) {
resource.out();
}
}
} class Resource {
private String name;
private int count = 1;
// 是否生成完毕
private boolean flag = false; public synchronized void set(String name) {
String threadName = Thread.currentThread().getName();
while (flag) {
try {
System.out.println(threadName+"进入等待状态");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(threadName+"取得执行权"); this.name = name + count;
count++;
System.out.println("生产者:" + this.name);
flag = true;
this.notify();
// this.notifyAll();
} public synchronized void out() {
String threadName = Thread.currentThread().getName();
while (!flag) {
try {
System.out.println(threadName+"进入等待状态");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(threadName+"取得执行权"); System.out.println("============消费者:" + name);
flag = false;
this.notify();
// this.notifyAll();
}
}
代码执行结果:
Thread-0取得执行权
生产者:资源1
Thread-0进入等待状态
Thread-1进入等待状态
Thread-3取得执行权
============消费者:资源1
Thread-3进入等待状态
Thread-2进入等待状态
Thread-0取得执行权
生产者:资源2
Thread-0进入等待状态
Thread-1进入等待状态
Java多线程synchronized关键字的更多相关文章
- Java 多线程 —— synchronized关键字
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java 多线程 - Synchronized关键字
目录 1-Synchronized 关键字概述 2- Synchronized关键字作用域 3- Synchronized 原理(反编译指令解释) 正文 1-Synchronized 关键字概述 由于 ...
- Java多线程-synchronized关键字
进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程 Ja ...
- java多线程 synchronized关键字的一些用法
看这篇文章啦: http://blog.csdn.net/xiao__gui/article/details/8188833
- Java的synchronized关键字:同步机制总结
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程 ...
- Java 多线程 - synchronize 关键字
目录 Java 多线程 - synchronize 关键字 Java 多线程 - synchronize 关键字 学习自 http://cmsblogs.com/?p=2071 https://www ...
- java基础Synchronized关键字之对象锁
java中Synchronized关键字之对象锁 当有多个线程对一个共享数据进行操作时,需要注意多线程的安全问题. 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同 ...
- java中synchronized关键字分析
今天我们来分析一下java中synchronized关键字.首先来看一段java代码:(本地编译环境为mac,jdk1.8的环境) Demo.java package com.example.spri ...
- Java基础-synchronized关键字的用法(转载)
synchronized--同步 顾名思义是用于同步互斥的作用的. 这里精简的记一下它的使用方法以及意义: 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在 ...
随机推荐
- linux学习笔记:1.基础知识和命令行基本操作
初次学习linux系统,想在这里记录自己的学习痕迹,如发现有不足之处,希望能指出,谢谢啦,之后的学习是在虚拟机VMware 10下的Red Hat Enterprise linux 6 的操作. 一. ...
- 关于JetBrains CLion 激活 (CLion License Activation)的解决办法,带hosts详细修改
CLion版本号:JetBrains CLion 2017.2.1 第一行选择Activite,第二行Activate license with:选择Activation code. 这个时候里面的代 ...
- Elevator poj3539
Elevator Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 1072 Accepted: 287 Case Time ...
- 项目发布Debug和Release版的区别
一.Debug和Release的区别 Debug:调试版本,包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试 ...
- web应用程序 前段部分调优
1. 使用瀑布图初步诊断网站性能瓶颈 一般来说,打开一个网页的速度会受到以下几项的影响: 1) 服务器花了太长的时间将.aspx页面的内容转化为html. 2) .aspx页面花了太长的时间从服务器端 ...
- VS2017 编译 chromium和webrtc
Chromium的编译和WebRTC的编译方式相同,WebRTC官网也是使用的Chromium的编译文档. 步骤一.跳 - 墙,先跳 - 墙这是第一步哟,chromium大概有10几个G,webrtc ...
- 从头编写 asp.net core 2.0 web api 基础框架 (3)
第一部分:http://www.cnblogs.com/cgzl/p/7637250.html 第二部分:http://www.cnblogs.com/cgzl/p/7640077.html 之前我介 ...
- Akka 的Actor
从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors.在这篇笔记的第二篇,我们会看一下Actors中的消息部分.而且延续上一次的例子,我们还会使用同样的学生与老师的例子 ...
- 【转载】CSS3 Transitions, Transforms和Animation使用简介与应用展示
文章转载自 张鑫旭-鑫空间-鑫生活 http://www.zhangxinxu.com/wordpress/ 原文链接:http://www.zhangxinxu.com/wordpress/?p=1 ...
- Django安装Xadmin步骤
在Django中安装Xadmin替换原始的admin,下面介绍两种方法安装 第一种方法:pip安装 第一步: 直接pip安装xadmin pip install xadmin pip会同时安装上面三个 ...