首页 > 代码库 > 线程的同步和安全
线程的同步和安全
如果多个线程同时运行同一个线程体,每次运行的结果可能都不一样
class MyThread implements Runnable{ int i = 10; public void run(){ while(true){ //获取当前运行线程的名字 System.out.println(Thread.currentThread().getName() + i); i--; Thread.yield(); if(i < 0){ break; } } }}
class Test{ public static void main(String args[]){ MyThread mt = new MyThread(); //生成共用同一线程体的两个线程对象 Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); //设置线程名字 t1.setName("A线程:"); t2.setName("B线程:"); //分别启动两个线程 t1.start(); t2.start(); }}
根据上图我们知道结果明显有错误,这就是多线程运行访问同一份数据时出现的错误。错误原因:AB线程轮流运行,假设B线程先运行了几行代码后(打印B线程:10)轮到A线程运行。A线程运行线程体后也打印A线程:10
为解决这个问题,我们使用java关键字:synchronized
class MyThread implements Runnable{ int i = 10; public void run(){ while(true){ //同步代码块 synchronized(this){ //获取当前运行线程的名字 System.out.println(Thread.currentThread().getName() + i); i--; Thread.yield(); if(i < 0){ break; } } } }}
使用同步代码块后,当A线程执行线程体时,获得了对象锁的使用权,即使A线程运行到yield方法时仍持有这个锁的使用权,B线程没有得到对象锁的使用权,则需要等待A线程执行完线程体释放对象锁。当B线程获得了对象锁的使用权后A线程也需要等待。线程的同步是为了防止多个线程访问同一数据时,对数据造成的破坏。
总结:
1.多线程访问同一对象中的同步代码块时,一个时间内只能有一个线程运行,其他线程对同步代码块的访问被阻塞,必须等待当前线程执行完同步代码块的内容
2.当一个线程访问同步代码块时,其他线程仍然可以访问非同步代码块的部分
3.每个对象只有一个锁。线程睡眠时也不会释放锁
线程的同步和安全
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。