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或者非静态方法或者是一个实例的时候,所同步的锁是加在 ...
随机推荐
- TETeLasr Cutting System 开机回零问题
TETeLasr Cutting System 开机回零问题 :打开 "轴信息" :打开 加工参数-->机器参数-->脉冲当量: X轴==4000 Y轴== ...
- mysql用户权限配置
创建管理员: mysqladmin -u root password 123456 登录 mysql -u root -p 建库及授权 > create database bdp charact ...
- "HK"日常之用C# Process写一只小病毒
众所周知,Process可以启动和关闭电脑上的进程,命名空间位于 System.Diagnostics,本次的教程就是利用其中的GetProcesses和Kill方法来实现的. 一.编码工作 首先我们 ...
- 分布式系统中生成全局ID的总结与思考
世间万物,都有自己唯一的标识,比如人,每个人都有自己的指纹(白夜追凶给我科普的,同卵双胞胎DNA一样,但指纹不一样).又如中国人,每个中国人有自己的身份证.对于计算机,很多时候,也需要为每一份数据生成 ...
- 定制自己的vue模版
前言 使用vue这个框架已经陆陆续续做了好几个项目了,不知不觉也已经在公司呆了4个月,转正了.时间如水...(省略一万字)./咳-不瞎扯了,公司是直接用的官方脚手架生成项目,官方模版没有vuex,ax ...
- win 7 系统ie浏览器升级11版本后,f12功能不可用的问题
自从把ie8升级成11后,f12功能就不可用了.浏览器兼容模式也无法使用. 解决办法:下载windows补丁 IE11-Windows6.1-KB3008923-x64.msu 下载地址: 64位:h ...
- python基于万象优图识别图片中的中文
最近一直在研究光学字符识别,即OCR.最开始在谷爹那里了解到了开源的Tesseract,可以拿来识别简单的英文和数字.但是识别中文的准确率并不高. 然后从Tesseract到Tesseract.js, ...
- [置顶]
win10 uwp 参考
态度随意申请专栏,没想到通过 看了我的博客,都是在别的大神博客看到,然后修改他们的 我看到的大神博客 东邪独孤 http://www.cnblogs.com/tcjiaan/ 老周,买了他的<W ...
- Java跨域问题的处理详解
1,JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题? 答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策 ...
- Android SDK国内更新
恩,废话就不多说了,俩网址,mirrors.neusoft.edu.cn和ubuntu.buct.edu.cn,在这里感谢wecloud和北京化工大学,十分感谢提供方便之门