JavaSE 多线程(2)同步函数
来源:互联网 发布:java 内存缓存 编辑:程序博客网 时间:2024/06/05 00:12
同步函数
package ticket;
class Ticket1 implements Runnable{//extends Thread{
private int num=100;
//Object obj=new Object();
public void run(){ //synchronized void run(){
// 不要把不该同步的代码同步,此时会出现问题,在这种情况下,0线程进来永远也出不去
//可以把需要同步的的代码封装起来,在加同步关键字,然后在run方法中调用。
while(true){
show();
}
}
public synchronized void show(){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----sale...."+num--);
}
}
}
public class synFunctionLockDemo {
public static void main(String[] args) {
Ticket1 t=new Ticket1();//创建一个线程任务
//Ticket tt=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
同步函数使用的锁是this
同步函数和同步代码块的区别:
同步函数的锁是固定的this
同步代码块的锁是任意的对象。
建议使用同步代码块。
package ticket;
class Ticket1 implements Runnable{//extends Thread{
private int num=100;
// Object obj=new Object();
boolean falg=true;
public void run(){
if (falg)
while(true){
synchronized(this){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----obj...."+num--);
}
}
}
else
while(true)
this.show();
}
public synchronized void show(){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----show...."+num--);
}
}
}
public class synFunctionLockDemo {
public static void main(String[] args) {
Ticket1 t=new Ticket1();//创建一个线程任务
//Ticket tt=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
try {Thread.sleep(10);} catch (InterruptedException e) {}
t.falg=false;
t2.start();
}
}
静态的同步函数使用的锁是 该函数所属的字节码文件对象
可以用getClass 方法获取,也可以用当前 类名.class 表示
package ticket;
class Ticket1 implements Runnable{//extends Thread{
private static int num=100;
// Object obj=new Object();
boolean falg=true;
public void run(){
if (falg)
while(true){
synchronized(Ticket.class){//(this.getClass()){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----obj...."+num--);
}
}
}
else
while(true)
this.show();
}
public static synchronized void show(){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----show...."+num--);
}
}
}
public class synFunctionLockDemo {
public static void main(String[] args) {
Ticket1 t=new Ticket1();//创建一个线程任务
//Ticket tt=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
try {Thread.sleep(10);} catch (InterruptedException e) {}
t.falg=false;
t2.start();
}
package ticket;
class Ticket1 implements Runnable{//extends Thread{
private int num=100;
//Object obj=new Object();
public void run(){ //synchronized void run(){
// 不要把不该同步的代码同步,此时会出现问题,在这种情况下,0线程进来永远也出不去
//可以把需要同步的的代码封装起来,在加同步关键字,然后在run方法中调用。
while(true){
show();
}
}
public synchronized void show(){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----sale...."+num--);
}
}
}
public class synFunctionLockDemo {
public static void main(String[] args) {
Ticket1 t=new Ticket1();//创建一个线程任务
//Ticket tt=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
同步函数使用的锁是this
同步函数和同步代码块的区别:
同步函数的锁是固定的this
同步代码块的锁是任意的对象。
建议使用同步代码块。
package ticket;
class Ticket1 implements Runnable{//extends Thread{
private int num=100;
// Object obj=new Object();
boolean falg=true;
public void run(){
if (falg)
while(true){
synchronized(this){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----obj...."+num--);
}
}
}
else
while(true)
this.show();
}
public synchronized void show(){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----show...."+num--);
}
}
}
public class synFunctionLockDemo {
public static void main(String[] args) {
Ticket1 t=new Ticket1();//创建一个线程任务
//Ticket tt=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
try {Thread.sleep(10);} catch (InterruptedException e) {}
t.falg=false;
t2.start();
}
}
静态的同步函数使用的锁是 该函数所属的字节码文件对象
可以用getClass 方法获取,也可以用当前 类名.class 表示
package ticket;
class Ticket1 implements Runnable{//extends Thread{
private static int num=100;
// Object obj=new Object();
boolean falg=true;
public void run(){
if (falg)
while(true){
synchronized(Ticket.class){//(this.getClass()){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----obj...."+num--);
}
}
}
else
while(true)
this.show();
}
public static synchronized void show(){
if (num>0) {
try {Thread.sleep(10);} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"----show...."+num--);
}
}
}
public class synFunctionLockDemo {
public static void main(String[] args) {
Ticket1 t=new Ticket1();//创建一个线程任务
//Ticket tt=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
try {Thread.sleep(10);} catch (InterruptedException e) {}
t.falg=false;
t2.start();
}
}
0 0
- JavaSE 多线程(2)同步函数
- JavaSE 多线程(2)
- javaSE 多线程之同步synchronized
- JavaSE:Java多线程并发和线程同步
- [javase]多线程(一)
- [javase]多线程(二)
- [javase]多线程(三)
- JavaSE 多线程(1)
- 【JavaSE笔记】多线程(一)进程&线程&Thread&同步代码块
- 多线程同步 -(C++)主要函数
- iOS 多线程+死锁(同步函数底层)
- 多线程四(同步函数)
- 多线程.同步函数
- 同步函数多线程
- 多线程同步函数
- 黑马程序员----多线程2(安全问题、同步代码块、同步函数、死锁)
- JavaSe总结-24- 多线程(2)
- javase-函数(方法)
- [SCOI2005]王室联邦
- Android studio 删除 导入的module
- eclipse如何修改背景颜色、字体颜色、字体大小
- 服务器文件部署操作(个人总结)
- QT 模仿Android游戏中虚拟摇杆(2)限定摇杆拖动范围
- JavaSE 多线程(2)同步函数
- js实现淘宝放大镜效果
- Android中的消息机制(MessageQueue, Looper, Handler)总结
- Socket和ServerSocket学习笔记
- Vijos P1303 导弹拦截
- 为什么要有心跳包的机制
- 五十道编程小题目 --- 24 java
- Android studio 解决AndroidRuntime: java.lang.VerifyError
- POJ 2778 ac机+矩阵快速幂+重载运算符