java多线程    Java入门    vsftp    ftp    linux配置    centos    FRP教程    HBase    Html5缓存    webp    zabbix    分布式    neo4j图数据库    

java多线程,同步与锁

  1. java多线程 生产消费者模型 (2014 年 7 月 30 日)
  2. java多线程 优先级 (2014 年 7 月 10 日)
  3. Java多线程,线程守护 (2014 年 7 月 7 日)
  4. Java多线程中的wait与notify,notifyall (2014 年 7 月 5 日)
  5. java 多线程join,合并线程 (2014 年 7 月 4 日)
  6. java多线程,让步yield (2014 年 7 月 2 日)
  7. java多线程休眠 (2014 年 7 月 1 日)
  8. java多线程,同步与锁 (2014 年 6 月 30 日)
  9. java采用Runnable 实现多线线程 (2014 年 6 月 29 日)
  10. java多线程要注意的地方 (2014 年 6 月 28 日)
  11. 认识多任务、多进程、单线程、多线程 (2014 年 6 月 28 日)
  12. java多线程编程全集 (2014 年 6 月 28 日)
  13. 顺序打印,经典java多线程例子 (2014 年 6 月 26 日)
  14. java多线程编程采用Thread继承 (2012 年 7 月 25 日)

线程的同步和锁的问题,我们先来看个例子,

下面的例子我们希望两个线程对m变量进行削减

package com.javaer.thread;
/**
 * 测试线程同步锁的问题
 * @author yuexiaosheng
 *
 */
public class SysTest implements Runnable {
	 int m = 10;

	public static void main(String[] args) {
		SysTest s1=  new SysTest();
		 Thread t1 = new Thread(s1, "Thread-t1");
		 Thread t2 = new Thread(s1, "Thread-t2");
		 t1.start();
		 t2.start();

	}
	public  void  reduce(){
		m--;
	}
	@Override
	public void run() {
		while(m>0)
		{
			 try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			this.reduce();
			System.out.println(Thread.currentThread().getName() + " m的值: " +m);

		}

	}

}
Thread-t1 m的值: 8
Thread-t2 m的值: 8
Thread-t1 m的值: 7
Thread-t2 m的值: 6
Thread-t1 m的值: 5
Thread-t2 m的值: 4
Thread-t1 m的值: 3
Thread-t2 m的值: 2
Thread-t1 m的值: 0
Thread-t2 m的值: 0

两个线程不加控制的执行了reduce操作,于是出现了两个8的情况。

如果我们想线程按照一定的顺序执行,可以进行同步

同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。

这里我们对reduce操作进行锁

public  synchronized  void  reduce()

即可实现我们想要的。

java同步锁的原理

一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。

同步和锁的要点
1.只能同步方法,不能同步变量和类
2.不要同步所有方法,仅仅同步必要的方法
3.如果一个synchronized方法正在被一个线程调用,其他线程不能调用,进入等待状态,只要方法被释放。
4.线程休眠的时候,不会自动释放锁
5.同步会伤害效率,多线程的目的是并发,锁的目的是反并发。所以尽可能的缩小锁的范围。
6对于非静态字段中可更改的数据,通常使用非静态方法访问。
对于静态字段中可更改的数据,通常使用静态方法访问。

什么时候需要用同步
1.访问依赖的资源,比如都要从1个任务池里领取任务的时候。
2.多个线程都会修改同一个公共变量的时候

死锁

当一个占用了锁的线程,出了问题,比如崩溃。其他等待的线程全部发生阻塞,将发生死锁,一旦发生死锁,程序就死掉。


This entry was posted in JAVA and tagged , , , . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/java-thread-lock/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

One Response to java多线程,同步与锁

Leave a Reply